Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP反射构建枚举_Php_Reflection_Static_Enums - Fatal编程技术网

使用PHP反射构建枚举

使用PHP反射构建枚举,php,reflection,static,enums,Php,Reflection,Static,Enums,我试图找到一种在PHP中处理枚举的方法。 我发现的所有方法实际上都不能使用枚举来限制函数/方法的参数,这是我需要枚举的主要原因 因此,我开始尝试创建自己的,但现在在使用反射时遇到了一个问题: <?php class Enum { private $_value; protected function __construct($value) { $this->_value = $value; } public function get

我试图找到一种在PHP中处理枚举的方法。 我发现的所有方法实际上都不能使用枚举来限制函数/方法的参数,这是我需要枚举的主要原因

因此,我开始尝试创建自己的,但现在在使用反射时遇到了一个问题:

<?php

class Enum {
    private $_value;
    protected function __construct($value) {
        $this->_value = $value;
    }

    public function getValue() {
        return $this->_value;
    }

    protected static function enumerate($class) {
        $ref = new ReflectionClass($class);
        $instances = array();
        foreach ($ref->getStaticProperties() as $name => $value) {
            $ref->setStaticPropertyValue($name, new $class($value));
        }
    }
}

class Book extends Enum {
    public static $COMIC = 1;
    public static $NOVEL = 2;
    public static $EDUCATIONAL = 3;

    public static function enumerate() {
        parent::enumerate(__CLASS__);
    }
}
Book::enumerate();

function read(Book $book) {
    echo '<hr/>';
    var_dump($book);
}

read(Book::$COMIC);
read(Book::$EDUCATIONAL);

?>
进入
setStaticPropertyValue
的值(
new$class
)是正确的,并且只创建了其中三个

getStaticProperties
仅拾取静态属性(它应该这样做),并且分配
private$\u值的唯一位置是在构造函数中。
为了完整性起见,构造函数只被调用了三次,在构造函数内部,正如预期的那样,值仅为1、2或3。简而言之,在调用
setStaticPropertyValue
之前,一切似乎都很好


我搞不懂这是怎么回事。
private$\u值
分配给此错误值的位置和原因?我使用反射的方式是否错误?是什么在创建这些无限递归对象?

这很吸引人。我喜欢跨越PHP界限的东西

不过,我不得不说,这似乎有点极端,根据反射的速度,它可能相当慢

对于我编写的框架,我创建了一个简单的。它所做的只是自动化定义。我更喜欢你的方法,因为你可以输入限制

你的代码对我有用。我在下面发布了我的编辑——它们主要是格式更改,所以我可以更容易地阅读

看看我对它做了什么。我用5.3.5和5.2.17测试了这一点-在任何一个上都很好

<?php
header( 'content-type: text/plain' );

Book::enumerate();
Book::$COMIC->read();
read(Book::$EDUCATIONAL);
read(Book::$NOVEL );

class Enum
{
    private $_value;
    protected function __construct($value)
    {
        $this->_value = $value;
    }

    public function getValue()
    {
        return $this->_value;
    }

    protected static function enumerate($class)
    {
        $ref = new ReflectionClass($class);
        $instances = array();

        foreach ( $ref->getStaticProperties() as $name => $value )
        {
            $ref->setStaticPropertyValue( $name, new $class( $value ) );
        }
    }
}

class Book extends Enum
{
    public static $COMIC = 'comic';
    public static $NOVEL = 'novel';
    public static $EDUCATIONAL = 'edu';

    public static function enumerate()
    {
        parent::enumerate(__CLASS__);
    }
    public function read()
    {
        echo "\nReading a {$this->getValue()} book\n";
    }
}

function read( Book $book )
{
    echo "\nReading a {$book->getValue()} book\n";
}

这很吸引人。我喜欢跨越PHP界限的东西

不过,我不得不说,这似乎有点极端,根据反射的速度,它可能相当慢

对于我编写的框架,我创建了一个简单的。它所做的只是自动化定义。我更喜欢你的方法,因为你可以输入限制

你的代码对我有用。我在下面发布了我的编辑——它们主要是格式更改,所以我可以更容易地阅读

看看我对它做了什么。我用5.3.5和5.2.17测试了这一点-在任何一个上都很好

<?php
header( 'content-type: text/plain' );

Book::enumerate();
Book::$COMIC->read();
read(Book::$EDUCATIONAL);
read(Book::$NOVEL );

class Enum
{
    private $_value;
    protected function __construct($value)
    {
        $this->_value = $value;
    }

    public function getValue()
    {
        return $this->_value;
    }

    protected static function enumerate($class)
    {
        $ref = new ReflectionClass($class);
        $instances = array();

        foreach ( $ref->getStaticProperties() as $name => $value )
        {
            $ref->setStaticPropertyValue( $name, new $class( $value ) );
        }
    }
}

class Book extends Enum
{
    public static $COMIC = 'comic';
    public static $NOVEL = 'novel';
    public static $EDUCATIONAL = 'edu';

    public static function enumerate()
    {
        parent::enumerate(__CLASS__);
    }
    public function read()
    {
        echo "\nReading a {$this->getValue()} book\n";
    }
}

function read( Book $book )
{
    echo "\nReading a {$book->getValue()} book\n";
}

当使用var_转储执行您的原始代码时,我没有收到递归消息。您的版本也不适用于我。我运行的是PHP5.2.4,因此只需对您使用的版本进行一些修复。我想中间一定有问题解决了。遗憾的是,我不能在我们的产品版本上更新PHP,但至少它可以在更新的版本上工作;反射的东西是一次性的,所以应该不会太糟糕。5.2.4已经很旧了。您说您无法更新,但如果可能,您应该更新。:)我似乎记得在5.2.4中读到过很多bug,但我可能错了。但是,这肯定是一个bug。当使用var_转储执行原始代码时,我没有收到递归消息。您的版本也不适用于我。我运行的是PHP5.2.4,因此只需对您使用的版本进行一些修复。我想中间一定有问题解决了。遗憾的是,我不能在我们的产品版本上更新PHP,但至少它可以在更新的版本上工作;反射的东西是一次性的,所以应该不会太糟糕。5.2.4已经很旧了。您说您无法更新,但如果可能,您应该更新。:)我似乎记得在5.2.4中读到过很多bug,但我可能错了。然而,这绝对是一个bug。
Reading a comic book

Reading a edu book

Reading a novel book