【问题标题】:Define data members within constructor在构造函数中定义数据成员
【发布时间】:2010-04-29 15:31:23
【问题描述】:

我有这个小sn-p代码,我希望能够将每个数组元素定义为一个新的数据成员。

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
        }

    }

【问题讨论】:

    标签: php oop class data-members


    【解决方案1】:

    //受保护的新数据成员

    您将无法在运行时创建非公共属性。如果 protected 是最重要的,您可以声明一个受保护的数组或对象,并在构造函数中将键/值插入其中

    【讨论】:

      【解决方案2】:
      1. 当你想访问对象的成员时总是使用 $this(它应该是 $this->data_members 在构造函数中)。
      2. 您可以尝试定义魔术方法 __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");
        } 
        

      【讨论】:

        【解决方案3】:

        您想要实现的目标是可能的,但是您将无法创建新属性 protected(因为这仅适用于预定义的成员)。

        function __construct($id = 0, $data = NULL)
        {
            foreach($this->$data_memebers as $name => $value ){
               $this->$name = $value;
            }
        }
        

        注意在$this->$namename 之前使用$:这使得PHP 使用$name 变量的当前值作为属性。

        【讨论】:

          猜你喜欢
          • 2014-10-12
          • 1970-01-01
          • 2018-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多