За последние 24 часа нас посетили 228114 программистов и 1731 робот. Сейчас ищут 1730 программистов ...

Get public class properties

Тема в разделе "Прочие вопросы по PHP", создана пользователем sDevAlex, 28 окт 2010.

  1. sDevAlex

    sDevAlex Активный пользователь

    С нами с:
    28 окт 2010
    Сообщения:
    53
    Симпатии:
    0
    Мне нужно узнать какие в классе есть открытые свойства, поиски в гугле дали только один более-менее нормальный результат: http://www.vancelucas.com/blog/get-only ... /#comments
    Код (Text):
    1. public function getFields()
    2. {
    3.     $getFields = create_function('$obj', 'return get_object_vars($obj);');
    4.     return $getFields($this);
    5. }
    Как вариант создать функцию вне класса, которая будет возвращать открытые свойства, но это очень не желательно, хотя можно создать статический метод в каком-то классе...Кто знает другие пути?
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
  3. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    напишите, если возможно, зачем вам программно узнавать, что там у класса есть?
     
  4. sDevAlex

    sDevAlex Активный пользователь

    С нами с:
    28 окт 2010
    Сообщения:
    53
    Симпатии:
    0
    А точней ReflectionClass + ReflectionProperty, iliavlad спасибо. Я тормознул, рефлекторов несколько штук же...
    Код (Text):
    1. class Pages extends CDbTable
    2. {
    3.     public $id;
    4.     public $title;
    5.     public $text;
    6.     public $name;
    7.     public $keywords = '';
    8.     public $description = '';
    9.  
    10.     //...
    11. }
    Модель данных, пишу CDbTable. Сейчас буду тестировать, что быстрей: рефлектор или create_function.
     
  5. sDevAlex

    sDevAlex Активный пользователь

    С нами с:
    28 окт 2010
    Сообщения:
    53
    Симпатии:
    0
    385 ms при 100 000 вызовах...
    Код (Text):
    1.     public function getFields()
    2.     {
    3.         $fields = array();
    4.         $className = get_class($this);
    5.         $reflect = new ReflectionClass($className);
    6.        
    7.         foreach($reflect->getProperties() as $property)
    8.             if($property->isPublic())
    9.                 $fields[] = $property->name;
    10.        
    11.         return $fields;
    12.     }
    318 ms при 100 000 вызовах...
    Код (Text):
    1.     public function getFields()
    2.     {
    3.         $getFields = create_function('$obj', 'return get_object_vars($obj);');
    4.         return $getFields($this);
    5.     }
    193 ms при 100 000 вызовах с кешированием...
    Код (Text):
    1.     public function getFields()
    2.     {
    3.         if(sizeof($this->fields) == 0)
    4.         {
    5.             $getFields = create_function('$obj', 'return get_object_vars($obj);');
    6.             $this->fields = $getFields($this);
    7.         }
    8.  
    9.         return $this->fields;
    10.     }
    Тесты под Windows, на денвере (что на нормальном хостинге скорость будет в 3-4 раза больше знаю).
     
  6. sDevAlex

    sDevAlex Активный пользователь

    С нами с:
    28 окт 2010
    Сообщения:
    53
    Симпатии:
    0
    Тему можно закрыть, я отказался от такого подхода. Практичней вытаскивать и кешировать поля из базы.