Мне нужно узнать какие в классе есть открытые свойства, поиски в гугле дали только один более-менее нормальный результат: http://www.vancelucas.com/blog/get-only ... /#comments Код (Text): public function getFields() { $getFields = create_function('$obj', 'return get_object_vars($obj);'); return $getFields($this); } Как вариант создать функцию вне класса, которая будет возвращать открытые свойства, но это очень не желательно, хотя можно создать статический метод в каком-то классе...Кто знает другие пути?
А точней ReflectionClass + ReflectionProperty, iliavlad спасибо. Я тормознул, рефлекторов несколько штук же... Код (Text): class Pages extends CDbTable { public $id; public $title; public $text; public $name; public $keywords = ''; public $description = ''; //... } Модель данных, пишу CDbTable. Сейчас буду тестировать, что быстрей: рефлектор или create_function.
385 ms при 100 000 вызовах... Код (Text): public function getFields() { $fields = array(); $className = get_class($this); $reflect = new ReflectionClass($className); foreach($reflect->getProperties() as $property) if($property->isPublic()) $fields[] = $property->name; return $fields; } 318 ms при 100 000 вызовах... Код (Text): public function getFields() { $getFields = create_function('$obj', 'return get_object_vars($obj);'); return $getFields($this); } 193 ms при 100 000 вызовах с кешированием... Код (Text): public function getFields() { if(sizeof($this->fields) == 0) { $getFields = create_function('$obj', 'return get_object_vars($obj);'); $this->fields = $getFields($this); } return $this->fields; } Тесты под Windows, на денвере (что на нормальном хостинге скорость будет в 3-4 раза больше знаю).