php - PHP7 匿名类中的静态属性

标签 php anonymous-class

我正在为我的一个项目开发 ORM,我试图通过使用匿名类来扩展基本抽象模型的默认功能,从而避免对类进行不必要的“硬编码”。

现在,所有查询都基于我想在匿名类中覆盖的静态属性 $table_name。但是,当我尝试这样做时,匿名类的所有其他实例都会收到相同的值,尽管理想情况下它们会获得自己不同的值。我只想在类中使用非静态属性,但有些静态函数使用静态属性。

我看到的选项是

  1. 手动创建每个类并对每个模型的表名进行硬编码
  2. 修改代码以使用非静态属性和参数

这两种解决方案都有效,但似乎没有我希望的那么优雅。有什么建议吗?

这是一个示例代码示例

模型类

<?php
class Model{
protected static $table_name;
public static function query_table(){
    [...use static::$table_name]
}

扩展匿名类

(new class() extends TableModel {
protected static $table_name         = null;

public function setTableName($table_name) {
    static::$table_name = $table_name;
}
});

最佳答案

我也有同样的想法,同样的问题。我快到了,但还剩下一个问题。 PHP 引擎将我的匿名类作为相同类型处理。这是演示问题的代码。

测试 1 导致两个类为同一类型并且 ID 被覆盖。 测试 2 导致第二个匿名类成为不同的类型,但每个 id 都需要另一个函数。

<?php
//define('TEST',1); //Uncomment to show Test1

class Foo
{
    public static function getID()
    {
        return static::$ID;
    }
};

function getClass($classID)
{
    $class = new class extends Foo
    {
        public static $ID;
    };
    $class::$ID = $classID;
    return $class;
}

function getAnotherClass($classID)
{
    $class = new class extends Foo
    {
        public static $ID;
    };
    $class::$ID = $classID;
    return $class;
}

if (defined('TEST')) { //Test 1 - Doesn't Works
    $class1 = getClass(1); //Expected 1 - Actual 5
    $class5 = getClass(5); //Expected 5 - Actual 5
} else { //Test 2 - Work
    $class1 = getClass(1); //Expected 1 - Actual 1
    $class5 = getAnotherClass(5); //Expected 5 - Actual 5
}
print "ClassID 1: " . $class1::getID() . PHP_EOL;
print "ClassID 5: " . $class5::getID() . PHP_EOL;
print "\tBecause the types are " . (get_class($class1) === get_class($class5) ? "" : "not ") . "equal." . PHP_EOL;

也许任何人都可以给我们一个提示。


更新解决方法

我使用 eval 找到了一个丑陋但有效的解决方案。

<?php

class Foo
{
    public static function getID()
    {
        return static::$ID;
    }
};

/**
 * Create a new class declaration
 *
 * @return string Returning the name of the new class.
 */
function createClass($classID): string
{
    eval('class Foo' . $classID . ' extends Foo 
    { 
        public static $ID = ' . $classID . ';
    };');

    return "Foo$classID";
}

$class1 = createClass(1);
$class5 = createClass(5);

$object1 = new $class1;
$object5 = new $class5;

print "ClassID 1 (" . get_class($object1) . "): " . $class1::getID() . PHP_EOL;
print "ClassID 5 (" . get_class($object5) . "): " . $class5::getID() . PHP_EOL;
print "\tBecause the types are " . (get_class($object1) === get_class($object5) ? "" : "not ") . "equal." . PHP_EOL;

关于php - PHP7 匿名类中的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40833199/

相关文章:

php - Laravel - OS X 上的 wkhtmltopdf 返回错误

php - 将数据库中的关键字显示为复选框选项

php - 为什么我得到的数值是 0 而不是 1?

php - 寻找加密/解密功能

java - Eclipse 匿名类折叠

php - 一个字符串的 md5 散列可以在一个地方与另一个地方不同吗?

Java,匿名内部类定义

java - 为什么所有匿名类都是隐式最终的?

Java:从匿名内部类访问局部变量? (优先队列)

java - 解决错误 'can not resolve symbol'