列出所有扩展类及其设置

时间:2015-07-02 08:55:35

标签: php oop laravel

我有一个系统,我正在创建多个类,这些类都从一个抽象类扩展。

每个班级还宣布'设置'对于那个特定的类类型。

示例:

    $url = 'https://api.parse.com/1/push';

$appId = 'xxx';
$restKey = 'xxx';



$push_payload = json_encode(array(
        "where" => '"deviceType"=>"winrt"',
        "data" => array(
                "alert" => "This is the alert text."
        )
));

$rest = curl_init();
curl_setopt($rest,CURLOPT_URL,$url);
curl_setopt($rest,CURLOPT_PORT,443);
curl_setopt($rest,CURLOPT_POST,1);
curl_setopt($rest,CURLOPT_POSTFIELDS,$push_payload);
curl_setopt($rest,CURLOPT_HTTPHEADER,
        array("X-Parse-Application-Id: " . $appId,
                "X-Parse-REST-API-Key: " . $restKey,
                "Content-Type: application/json"));
                $response = curl_exec($rest);
                echo $response;
                var_dump($response);
    }

class First extends Base {

    protected $name = 'First';
    protected $lug = 'first';
    protected $fields = [
        'name',
        'address',
        'phone',
    ];

    function __construct()
    {
        parent::__construct();
    }

    public function abstractMethod()
    {
        // do stuff for this particular class
    }


}

现在我想要做的就是抓住所有扩展课程和他们的设置'并返回这样的内容:

class Second extends Base {

    protected $name = 'Second';
    protected $lug = 'second-one';
    protected $fields = [
        'first-name',
        'last-name',
        'email',
    ];

    function __construct()
    {
        parent::__construct();
    }

    public function abstractMethod()
    {
        // do stuff for this particular class
    }


}

那我该怎么做呢?还有更好的方法吗?

如果有帮助,我正在使用Laravel。

编辑:解释为什么不重复

我不仅仅是在获得课程及其信息之后,我正在设法解决这种情况。我本质上是在创建一个可扩展的插件系统,需要一种方法来告诉你哪些插件已被添加。

3 个答案:

答案 0 :(得分:1)

我没试过,但它应该有用。或者它会引导你。

$result = array();
foreach (get_declared_classes() as $class) {
    if (is_subclass_of($class, 'Base'))
        $result[] = get_class_vars($class);
}

但是你的房产也需要公开。

答案 1 :(得分:1)

使用ReflectionClass怎么样?获取属性非常简单,例如下面的手册。列出扩展类也应该很容易。

<?php
class Bar {
    protected $inheritedProperty = 'inheritedDefault';
}

class Foo extends Bar {
    public $property = 'propertyDefault';
    private $privateProperty = 'privatePropertyDefault';
    public static $staticProperty = 'staticProperty';
    public $defaultlessProperty;
}

$reflectionClass = new ReflectionClass('Foo');
var_dump($reflectionClass->getDefaultProperties());

输出:

array(5) {
   ["staticProperty"]=>
   string(14) "staticProperty"
   ["property"]=>
   string(15) "propertyDefault"
   ["privateProperty"]=>
   string(22) "privatePropertyDefault"
   ["defaultlessProperty"]=>
   NULL
   ["inheritedProperty"]=>
   string(16) "inheritedDefault"
}

答案 2 :(得分:0)

使用ReflectionObject你可以这样做:

$result = array();
foreach (get_declared_classes() as $class) {
    if (is_subclass_of($class, 'Base')) {
        $obj = new $class;
        $refObj = new ReflectionObject($obj);
        $props = $refObj->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);
        $classProps = array();
        foreach ($props as $prop) {
            $property = $refObj->getProperty($prop->getName());
            $property->setAccessible(true);
            $classProps[$prop->getName()] = $property->getValue($obj);
        }
        $result[$class] = $classProps;
    }
}
print_r($result);

输出:

Array (
    [First] => Array (
        [name] => First
        [lug] => first
        [fields] => Array (
             [0] => name
             [1] => address
             [2] => phone
         )
     )
     [Second] => Array (
         [name] => Second
         [lug] => second-one
         [fields] => Array (
             [0] => first-name
             [1] => last-name
             [2] => email
         )
     )
)