题
我有这个小的代码段,我希望能够将每个数组元素定义为新的数据成员。
class Core_User
{
protected $data_members = array(
'id' => '%d',
'email' => '"%s"',
'password' => '"%s"',
'title' => '"%s"',
'first_name' => '"%s"',
'last_name' => '"%s"',
'time_added' => '%d' ,
'time_modified' => '%d' ,
);
function __construct($id = 0, $data = NULL)
{
foreach($this->data_members as $member){
//protected new data member
}
}
解决方案
//保护新数据成员
您将无法在运行时创建非公共属性。如果受保护是最重要的,您可以将受保护的数组或对象声明并在构造函数中插入键/值
其他提示
- 当您想访问对象的成员时,请务必使用$ this(构造器中的$ this-> data_members)。
您可以尝试定义魔法方法__get&__set(我不确定它们是否可以受到保护)。 :
protected function __get($name){ if (array_key_exists($name,$this->data_memebers)) { return $this->data_memebers[$name]; } throw new Exception("key $name doesn't not exist"); } protected function __set($name,$value){ if (array_key_exists($name,$this->data_memebers)) { $this->data_memebers[$name] = $value; } throw new Exception("key $name doesn't not exist"); }
您想实现的目标是可能的,但是您将无法制作新属性 protected
(因为这仅适用于预定义的成员)。
function __construct($id = 0, $data = NULL)
{
foreach($this->$data_memebers as $name => $value ){
$this->$name = $value;
}
}
注意使用 $
前 name
在 $this->$name
: :这使得PHP使用当前值 $name
变量为属性。
不隶属于 StackOverflow