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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Приведение типа объекта

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как?
JROUD
Отправлено: 21 Сентября, 2012 - 14:32:36
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Привет! Не разобрался, как на пхп реализовано приведение типов, когда это касается объектов.
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();

В общем вопрос в том, как привести тип объекта? Спасибо. Закатив глазки
 
 Top
EuGen Администратор
Отправлено: 21 Сентября, 2012 - 15:22:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Базовый класс не может знать о том, каким образом и что от него унаследовано. Приведение типов здесь ни при чем, у Вас некорректное понимание о наследовании. Если нужны методы базового класса и некоторая собственная специфика - то это можно сделать, унаследовав свойства базового класса. "Наоборот" - не несет в себе никакого смысла.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 21 Сентября, 2012 - 15:26:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




JROUD
Зачем вообще в PHP приведение типов?
это скриптовый язык с динамической типизацией


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
JROUD
Отправлено: 21 Сентября, 2012 - 16:28:26
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




EuGen пишет:
Если нужны методы базового класса и некоторая собственная специфика - то это можно сделать, унаследовав свойства базового класса.

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

Однако Для приведения типов...
 
 Top
snikers987
Отправлено: 21 Сентября, 2012 - 16:48:19
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




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.  

(Отредактировано автором: 21 Сентября, 2012 - 16:49:17)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
JROUD
Отправлено: 21 Сентября, 2012 - 17:44:14
Post Id


Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




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

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


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Мой вопрос заключается в том, позволяет ли это делать PHP или нет

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

В PHP бессмысленно приведение. В нем просто нет необходимости


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DlTA
Отправлено: 21 Сентября, 2012 - 17:52:26
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




caballero пишет:
В PHP бессмысленно приведение. В нем просто нет необходимости

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

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



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




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

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


Если взять 2 одинаковые стиральные машины, в одну встроить сушилку(унаследовав функционал стиральной машины), а вторую оставить просто стиральной машиной(не добавляя свойств сушилки), и пытаться в ней сушить, абсурд?
Это если для вас понятнее такая абстракция.

(Отредактировано автором: 21 Сентября, 2012 - 18:07:44)



-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
caballero
Отправлено: 21 Сентября, 2012 - 18:22:18
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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

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

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

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

подскажет еси ты явно объявищь тип переменной
но к приведенгию типов это не имеет отношения
никакмя IDE не проследит код тобы понять какой тип будет в рантайме

(Отредактировано автором: 21 Сентября, 2012 - 18:23:49)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DlTA
Отправлено: 21 Сентября, 2012 - 18:29:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




caballero пишет:
никакмя IDE не проследит код тобы понять какой тип будет в рантайме
если в описании функции четко указать тип возвращаемого значения то подскажет
 
 Top
caballero
Отправлено: 21 Сентября, 2012 - 18:49:52
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
если в описании функции четко указать тип возвращаемого значения то подскажет

описание в коментариях к коду не относится и к приведению типов тем более


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DlTA
Отправлено: 21 Сентября, 2012 - 20:44:08
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




caballero, либо вы не работали с человеческой IDE, либо мы говорим о разных вещах

смотрите скрин
Прикреплено изображение (Нажмите для увеличения)
класс.jpg
 
 Top
caballero
Отправлено: 21 Сентября, 2012 - 21:00:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




о разных вещах
IDE может понимать подсказки в коментариях
но к самому коду это не относитсся
можно написать левый тип и IDE его покажет но в коде будет совсем другое

изначально речь шла о приведении типов
указание типа в коментариях для IDE
к компиляции и выполнению кода отношения не имеет


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DlTA
Отправлено: 21 Сентября, 2012 - 21:06:37
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




ну тоды как я и писал выше
DlTA пишет:
судя по тесту и ошибкам, можно реализовать только как дополнительный метод класса, который будет возвращать объект нужного класса.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB