2010-09-28 7 views
0

Я пишу некоторые PHP. У меня есть несколько классов, которые не объявляют никаких свойств, общедоступных или других. У меня есть пользовательский класс MySql, который извлекает объекты из MySql и устанавливает значение свойств для вновь init'd объекта PHP как так ...PHP Автоматические свойства/перегрузка

while ($row = mysql_fetch_assoc($result)) 
{ 
    foreach($row as $key => $value) 
    { 
     $this->{$key} = $value;   
    } 
} 

Это, кажется, работает хорошо, как я могу после этого вызова указанных свойств в любом месте я нравлюсь ... $this->my_auto_property и т. Д. Я не могу найти никаких документов PHP, которые описывают это как способ перегрузить свойства объекта класса.

Это нормально? Я хочу убедиться, что это не какая-то обратная совместимость, которая испарится в будущих выпусках PHP.

ответ

0

Это не перегружает какое-либо свойство, оно просто устанавливает свойство с использованием переменных переменных. Динамическое создание новых свойств всегда было особенностью PHP. Конечно, никто не может гарантировать, что он не будет устаревшим, но способ, которым PHP пользуется слабым набором текста, я бы сказал, что это маловероятно.

Альтернативой является сохранение значений в массиве и создание магии __get accessor для их чтения, если вы хотите увеличить инкапсуляцию и контролировать доступность.

+0

я вторая помощи аксессора перегружать для немного больше в будущем теплоизолирующих страхований. –

0

попробовать что-то вроде этого:

<?php 
/** 
* This class creates a dynamic shell to 
* define and set any Setter or Getter 
* 
* Example: 
* 
* $property = new DynamicProperties(); 
* $property->setFax("123-123-1234"); // set[anything here first letter upper case]("value here") 
* echo $property->getFax()."\n"; // get[anything here first letter upper case]() 
*/ 

class DynamicProperties { 
    private $properties; 

    public function __call($name, $args) { 
     if (preg_match('!(get|set)(\w+)!', $name, $match)) { 
      $prop = $match[2]; 
      if ($match[1] == 'get') { 
       if (count($args) != 0) { 
        throw new Exception("Method '$name' expected 0 arguments, got " . count($args)."\n"); 
       } 
       return $this->properties[$prop]; 
      } else { 
       if (count($args) != 1) { 
        throw new Exception("Method '$name' expected 1 argument, got " . count($args)."\n"); 
       } 
       $this->properties[$prop] = $args[0]; 
      } 
     } else { 
      throw new Exception("Unknown method $name"); 
     } 
    } 
} 
?> 
Смежные вопросы