我正在使用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设置为受保护的类型。
我该怎么做? 或者有更好的方法来设置我的动态命名属性的名称吗?
答案 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。但是,除非你有一些真正复杂的功能来证明使用它的时间,否则它将使你的生活更轻松。