如何在构造函数中创建属性的属性类型 - PHP

时间:2014-12-30 23:14:21

标签: php oop

我正在使用PHP。

由于在类的核心中定义的属性必须是静态的,我必须在构造函数中创建一个属性,以允许我使用动态名称创建它。

实施例

final class User extends Z
{

}

Abstract Class Z
{
    function __constructor()
    {
        $x = get_called_class() . 'Id';
        $this->$x = null;
    }
}

如果我们 var_dump() obj用户我们会

object(User)#1 (1) {
  ["UserId"]=>
  NULL
}

我想将属性A设置为受保护的类型。

我该怎么做? 或者有更好的方法来设置我的动态命名属性的名称吗?

2 个答案:

答案 0 :(得分:0)

你可以做的最好的事情是使用魔术getter / setter方法和一系列属性:

<?php

abstract class Z
{
    private $properties = array();

    function __construct()
    {
        $x = get_called_class();
        $this->$x = null;
    }

    public function __set($prop, $val)
    {
        $this->properties[$prop] = $val;
    }

    public function __get($prop)
    {
        return $this->properties[$prop];
    }
}

class A extends Z
{

}

var_dump(new A());

请注意,该属性是私有的,子类必须通过__get__set方法。

您还可以将限制动态属性仅作为被调用的类名。

<?php

abstract class Z
{
    private $classprop;

    function __construct()
    {
        $x = get_called_class();
        $this->$x = true;
    }

    public function __set($prop, $val)
    {
        if ($prop !== get_called_class()) {
            throw new \UnexpectedValueException('Cannot Set Dynamic properties Other than Class Name');
        }

        $this->classprop = $val;
    }

    public function __get($prop)
    {
        if ($prop !== get_called_class()) {
            throw new \UnexpectedValueException('Cannot Get Dynamic properties Other than Class Name');
        }

        return $this->classprop;
    }
}

class A extends Z
{

}

我鼓励您仔细考虑为什么需要这样的动态属性。

答案 1 :(得分:0)

最简单的答案是不要 - 只需使用一些通用基本属性,例如protected $Id;并省去麻烦。

如果你真的必须拥有&#34;动态&#34;类扩展中的属性,最简单的可能是在扩展类中声明属性:

final class User extends Z {

    protected $UserId;

}

然后,Z中的代码将挑选出此受保护的属性。它是psudo-dynamic,因为属性名称由编码器决定,而脚本只有&#34;才能找到&#34;它在构造函数运行时,但如果你的属性名已经由在编译时修复的东西确定,例如类名,那么在功能上没有区别。

对于真正的动态属性创建,您必须添加一个runkit,一个允许您以编程方式从脚本本身更改类,方法,属性和函数的扩展。一个好的似乎是this one by Demitry Zenovich。但是,除非你有一些真正复杂的功能来证明使用它的时间,否则它将使你的生活更轻松。