[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: "свойство" как объект
tbazadaykin
начинаю освайвать реализацию ооп в пхп. возник вопрос как определить свойство-объект?
ну например
$a = new MyClass;
$a->b->c = 5;


при этом b должно быть объектом определенного класса. как это правильно реализовывается? как я делал (но я не уверен что это верный подход, хотя и работает):

class psn extends stdClass {
function __construct() {
$this->http = new Snoopy();
}
}


$p = new psn();
$p->http->proxy_host = '127.0.0.1';
$p->http->proxy_port = '8888';
$p->http->fetch('http://yandex.ru');
print $p->http->results;


я так подозреваю что способов может быть несколько. может кто посоветует ссылку какую по этому вопросу (где рассматриваются способы из + и -, когда какой лучше применять и т.д.). заранее спасибо.



Спустя 3 часа, 19 минут, 47 секунд (21.06.2010 - 16:22) SlavaFr написал(а):
так как нет не каких специалных возможностей навязать свойству тип, прейдется опрашивать свойсто посредствоm instanceof

Спустя 23 минуты, 35 секунд (21.06.2010 - 16:46) Ice написал(а):
Цитата (SlavaFr @ 21.06.2010 - 17:22)
так как нет не каких специалных возможностей навязать свойству тип, прейдется опрашивать свойсто посредствоm instanceof

как это нет возможности навязать?

например

public function func( User $login ) {
// сюда может быть только параметр от класса User теперь.
}

В качестве примера ответа на Ваш вопрос можно рассмотреть паттерн Composite

Спустя 5 минут, 14 секунд (21.06.2010 - 16:51) SlavaFr написал(а):
@Ice а как с функцией быть которая тип ретурна навязывать должна ?

Спустя 9 минут, 13 секунд (21.06.2010 - 17:00) Ice написал(а):
передать -> перегрузить -> ретурнить. И всё:) Или я не понимаю чего?


class Example {
private $var;
public function __construct( User $login ) {
$this->var = $login; // здесь instanceof User
return $login;
}
}


Очень упрощенная модель.

Спустя 7 минут, 8 секунд (21.06.2010 - 17:07) SlavaFr написал(а):
в ява или другом языке, я при обявлении функции обявляю также тип ретурна.
в пхп такой конструкции нет.
т.е при выражении $object->member нет не какой возможности гарантировать тип етого свойства и чтоб сказать с 100% гарантией что $object->member является типом User, я должен зделать

if($object->member instanceof User){.....}

Спустя 29 минут, 31 секунда (21.06.2010 - 17:37) Ice написал(а):
в РНР, если при вышеописанной конструкции попытаетесь передать в функцию что-то другое, - заругается. А, передав, Ваша задача в том, чтобы внутри функции сохранить переданный параметр в неизменном виде.

Спустя 47 минут, 20 секунд (21.06.2010 - 18:24) SlavaFr написал(а):
да,через функции можно обеспечить передачу параметра определенного типа.
да, я могу сохронить параметер в неизменненом виде.

НО нет механизма заставляющего меня выдать чтото определенного типа, а так же нет возмознности заставить меня сохронить параметер в неизменненом виде.

в ява
User vasja;


и ты уже не можеш зделать
vasja=10;
так как vasja только типа User может быть
в пхп ты можес записать в vasja что угодно и компилер абсолютно не возразит.

в ява
public User getUser(){.....}
заставит функцю выдавать ретурном Обект только типа User.
каждая функция должна иметь ретурн тип например void

всякая попытка нарушить эти правила будет наказана компилером.

в ПХП в функциях нет вообще ретурн типа, и догодатся о том, что фунция передает можно только из документации или жизненного опыта smile.gif
т.е. Мы не можем в пхп навязать ретурн тип, так как компилеру он абсолютно безразличен.

instanceof к сожалению единственная возможность гарантировать качественный код и быть действительно увереным в том, что работаете с правильным типом особенно если это косается наследственности.



Спустя 6 дней, 17 часов, 10 минут, 48 секунд (28.06.2010 - 11:35) linker написал(а):
Люди, запомните, PHP - не строго типизированный язык. Поэтому вопросы, а как типизировать ретурн - бесполезны. Юзайте instanceof и будет вам счастье. Хотя и тут есть нюансы, пример

class User
{
...
}
class SuperUser extends TUser
{
...
}
$User = new SuperUser();
echo ($User instanceof User)

Результатом будет TRUE.


Спустя 4 часа, 31 минута, 1 секунда (28.06.2010 - 16:06) SlavaFr написал(а):
Цитата (linker @ 28.06.2010 - 08:35)
echo ($User instanceof User)
Результатом будет TRUE.

я бы испугался если бы было по другому smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.