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 :: Версия для печати :: Приведение типа объекта
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Приведение типа объекта

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

1. JROUD - 21 Сентября, 2012 - 14:32:36 - перейти к сообщению
Привет! Не разобрался, как на пхп реализовано приведение типов, когда это касается объектов.
PHP:
скопировать код в буфер обмена
  1. // Таблица
  2. class docxTable extends DOMElement
  3. {
  4.     public function getHTML()
  5.     {
  6.         $value = '<table>';
  7.         foreach($this->getElementsByTagName('tr') as $row)
  8.         {
  9.             $value .= $row->getHTML();
  10.         }
  11.         $value .= '</table>';
  12.         return $value;
  13.     }
  14. }
  15. // Рядок таблицы
  16. class docxRow extends DOMElement
  17. {
  18.     public function getHTML()
  19.     {
  20.         // ...
  21.     }
  22. }

В данном конкретном случае я использую функцию getElementsByTagName, которая возвращает массив объектов типа DOMElement. Далее мне нужно обработать каждый объект в массиве, для этого в классе docxRow, который расширяет класс DOMElement, есть метод getHTML. Так вот, идея такая, привести объект класса DOMElement к типу docxRow, чтобы можно было использовать его метод getHTML. Не уверен, что доходчиво пояснил ситуацию...
Если в контексте, то сейчас так:

а нужно как-то так:
PHP:
скопировать код в буфер обмена
  1. $value .= ($row as docxRow)->getHTML();

или так:
PHP:
скопировать код в буфер обмена
  1. $value .= ((docxRow)$row)->getHTML();

или:
PHP:
скопировать код в буфер обмена
  1. $row = (docxRow)$row;
  2. $value .= $row->getHTML();

В общем вопрос в том, как привести тип объекта? Спасибо. Закатив глазки
2. EuGen - 21 Сентября, 2012 - 15:22:38 - перейти к сообщению
Базовый класс не может знать о том, каким образом и что от него унаследовано. Приведение типов здесь ни при чем, у Вас некорректное понимание о наследовании. Если нужны методы базового класса и некоторая собственная специфика - то это можно сделать, унаследовав свойства базового класса. "Наоборот" - не несет в себе никакого смысла.
3. caballero - 21 Сентября, 2012 - 15:26:47 - перейти к сообщению
JROUD
Зачем вообще в PHP приведение типов?
это скриптовый язык с динамической типизацией
4. JROUD - 21 Сентября, 2012 - 16:28:26 - перейти к сообщению
EuGen пишет:
Если нужны методы базового класса и некоторая собственная специфика - то это можно сделать, унаследовав свойства базового класса.

То, что можно унаследовать свойства базового класса - это и так понятно, но вполне логично предположить, если один класс наследует другой, то объект базового класса может быть приведён к типу класса наследника. Мой вопрос заключается в том, позволяет ли это делать PHP или нет.
caballero пишет:
Зачем вообще в PHP приведение типов?

Однако Для приведения типов...
5. snikers987 - 21 Сентября, 2012 - 16:48:19 - перейти к сообщению
JROUD пишет:
EuGen пишет:
Если нужны методы базового класса и некоторая собственная специфика - то это можно сделать, унаследовав свойства базового класса.

То, что можно унаследовать свойства базового класса - это и так понятно, но вполне логично предположить, если один класс наследует другой, то объект базового класса может быть приведён к типу класса наследника. Мой вопрос заключается в том, позволяет ли это делать PHP или нет.
caballero пишет:
Зачем вообще в PHP приведение типов?

Однако Для приведения типов...


Ну и где тут логика? Потомок может рассматриваться как экземпляр базового класса, так как реализует все его интерфейсы, в то время как наследник реализует дополнительные, о которых базовый класс понятия не имеет.

PHP:
скопировать код в буфер обмена
  1.  
  2. class Foo{
  3.        
  4.         public function baz(Foo $obj){
  5.                 return true;
  6.         }
  7. }
  8.  
  9. class Bar extends Foo{
  10.         public function test(Bar $obj){
  11.                 return true;
  12.         }
  13.        
  14. }
  15.  
  16.  
  17. $foo = new Foo;
  18. $bar = new Bar;
  19.  
  20.  
  21.  
  22. var_dump($foo->baz($foo)); //ok
  23. var_dump($foo->baz($bar)); //ok
  24.  
  25. var_dump($bar->test($bar)); //ok
  26. var_dump($bar->test($foo)); //error
  27.  
6. JROUD - 21 Сентября, 2012 - 17:44:14 - перейти к сообщению
snikers987 пишет:
Потомок может рассматриваться как экземпляр базового класса, так как реализует все его интерфейсы, в то время как наследник реализует дополнительные, о которых базовый класс понятия не имеет.

Правильно. Потомок расширяет сущность родителя полностью наследуя её. Это как если встроить сушилку в стиральную машинку. Наличие сушилки в стиральной машинке не мешает ей быть стиральной машинкой, так и наличие новых членов у класса-потомка не означает отсутствие у него членов класса-родителя, поэтому логично и то, что объект класса родителя может быть приведён к типу класса потомка. Не вижу здесь ничего противоречивого.
7. caballero - 21 Сентября, 2012 - 17:46:26 - перейти к сообщению
Цитата:
Мой вопрос заключается в том, позволяет ли это делать PHP или нет

Цитата:
Для приведения типов...

В PHP бессмысленно приведение. В нем просто нет необходимости
8. DlTA - 21 Сентября, 2012 - 17:52:26 - перейти к сообщению
caballero пишет:
В PHP бессмысленно приведение. В нем просто нет необходимости

эт смотря как кодить и какой IDE пользоваться

если мне лениво запоминать все разнообразие ключей передваемый в массиве, и куда приятней работать объектов поля которого мне подскажет сама IDE. то вопрос очень даже адекватный.
(Добавление)
судя по тесту и ошибкам, можно реализовать только как дополнительный метод класса, который будет возвращать объект нужного класса.
9. snikers987 - 21 Сентября, 2012 - 18:06:22 - перейти к сообщению
JROUD пишет:
snikers987 пишет:
Потомок может рассматриваться как экземпляр базового класса, так как реализует все его интерфейсы, в то время как наследник реализует дополнительные, о которых базовый класс понятия не имеет.

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


Если взять 2 одинаковые стиральные машины, в одну встроить сушилку(унаследовав функционал стиральной машины), а вторую оставить просто стиральной машиной(не добавляя свойств сушилки), и пытаться в ней сушить, абсурд?
Это если для вас понятнее такая абстракция.
10. caballero - 21 Сентября, 2012 - 18:22:18 - перейти к сообщению
Цитата:
эт смотря как кодить и какой IDE пользоваться

при чем тут кодинг и IDE

PHP - нетипизированый язык

Цитата:
куда приятней работать объектов поля которого мне подскажет сама IDE.

подскажет еси ты явно объявищь тип переменной
но к приведенгию типов это не имеет отношения
никакмя IDE не проследит код тобы понять какой тип будет в рантайме
11. DlTA - 21 Сентября, 2012 - 18:29:17 - перейти к сообщению
caballero пишет:
никакмя IDE не проследит код тобы понять какой тип будет в рантайме
если в описании функции четко указать тип возвращаемого значения то подскажет
12. caballero - 21 Сентября, 2012 - 18:49:52 - перейти к сообщению
Цитата:
если в описании функции четко указать тип возвращаемого значения то подскажет

описание в коментариях к коду не относится и к приведению типов тем более
13. DlTA - 21 Сентября, 2012 - 20:44:08 - перейти к сообщению
caballero, либо вы не работали с человеческой IDE, либо мы говорим о разных вещах

смотрите скрин
14. caballero - 21 Сентября, 2012 - 21:00:08 - перейти к сообщению
о разных вещах
IDE может понимать подсказки в коментариях
но к самому коду это не относитсся
можно написать левый тип и IDE его покажет но в коде будет совсем другое

изначально речь шла о приведении типов
указание типа в коментариях для IDE
к компиляции и выполнению кода отношения не имеет
15. DlTA - 21 Сентября, 2012 - 21:06:37 - перейти к сообщению
ну тоды как я и писал выше
DlTA пишет:
судя по тесту и ошибкам, можно реализовать только как дополнительный метод класса, который будет возвращать объект нужного класса.

 

Powered by ExBB FM 1.0 RC1