Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: extends от объекта
Форумы портала PHP.SU » » Объектно-ориентированное программирование » extends от объекта

Страниц (1): [1]
 

1. alexxorlovv - 28 Ноября, 2013 - 04:09:26 - перейти к сообщению
Парни кто нибудь знает как на stdclass сделать extends? допустим приходит json stdclass он декодируется. А затем нужно чтобы он унаследовал все методы другого класса.Как такое можно сделать?(если вообще это возможно) может есть какой то DesignPattern?
2. armancho7777777 - 28 Ноября, 2013 - 04:48:27 - перейти к сообщению
Только путём агрегирования.
3. tato - 28 Ноября, 2013 - 04:51:14 - перейти к сообщению
Есть агрегация и композиция. Это когда объекты одного класса входят в другой.
например:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Test
  3. {
  4.  
  5.     private $_obj;
  6.  
  7.     public function __construct( $obj )
  8.     {
  9.         $this->_obj = $obj;
  10.     }
  11.  
  12.     public function getName()
  13.     {
  14.           return $this->_appendString( $this->_obj->name );
  15.     }
  16.  
  17.     private function _appendString( $string, $prefix = 'pref_' )
  18.     {
  19.         return "$prefix$string";
  20.     }
  21. }
  22.  
  23.  
  24. $std_class = json_decode( $json_data );
  25. $test = new Test( $std_class );
  26.  
  27. echo $test->getName();
  28.  

(Добавление)
еще можно использовать __call() для доступа к методам.
4. armancho7777777 - 28 Ноября, 2013 - 05:08:54 - перейти к сообщению
Реализация №1 (Отобразить)

Примеры (Отобразить)

Результат (Отобразить)

Во второй реализации объекты будут создаваться динамически (единожды)
в момент обращения к свойству, если текущее значение является массивом,
чтобы не плодить объекты, которые не будут использованы.
Если класс не переполнен функционалом - это не критично,
в противном случае может заметно увеличиться потребление памяти.

Реализация №2 (Отобразить)

PHP:
скопировать код в буфер обмена
  1. $sJson = json_encode(array('foo' => array('bar' => 'Hello!')));
  2. $rJson = jsonDecode($sJson);
  3.  
  4. echo $rJson->foo->bar;
5. AmsTaFF - 28 Ноября, 2013 - 08:53:40 - перейти к сообщению
Перечислю способы, которые применимы (которые я видел как применяли, или сам применял) в случае, если есть некий класс, и для него есть данные в JSON формате

например с http://php.net/manual/ru/book.reflection.php ReflectionClass. Он более сложный и "опасный", но он применим, когда нужно задать приватные данные в объекте.

когда есть класс с сеттерами/геттерами и методами и неохота менять его как-то, то я использую класс/метод который переводит объект std в экземпляр соответствующего класса. В этом классе/методе происходят все проверки и прочая лабуда

* класс или метод выбирается относительно объема операций, которые надо совершить над std-объектом, чтобы привести его к нужному экземпляру класса.
6. alexxorlovv - 29 Ноября, 2013 - 07:59:41 - перейти к сообщению
Спасибо всем.

 

Powered by ExBB FM 1.0 RC1