ну например
$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, я должен зделать
в пхп такой конструкции нет.
т.е при выражении $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
всякая попытка нарушить эти правила будет наказана компилером.
в ПХП в функциях нет вообще ретурн типа, и догодатся о том, что фунция передает можно только из документации или жизненного опыта
т.е. Мы не можем в пхп навязать ретурн тип, так как компилеру он абсолютно безразличен.
instanceof к сожалению единственная возможность гарантировать качественный код и быть действительно увереным в том, что работаете с правильным типом особенно если это косается наследственности.
да, я могу сохронить параметер в неизменненом виде.
НО нет механизма заставляющего меня выдать чтото определенного типа, а так же нет возмознности заставить меня сохронить параметер в неизменненом виде.
в ява
User vasja;
и ты уже не можеш зделать
vasja=10;
так как vasja только типа User может быть
в пхп ты можес записать в vasja что угодно и компилер абсолютно не возразит.
в ява
public User getUser(){.....}
заставит функцю выдавать ретурном Обект только типа User.
каждая функция должна иметь ретурн тип например void
всякая попытка нарушить эти правила будет наказана компилером.
в ПХП в функциях нет вообще ретурн типа, и догодатся о том, что фунция передает можно только из документации или жизненного опыта

т.е. Мы не можем в пхп навязать ретурн тип, так как компилеру он абсолютно безразличен.
instanceof к сожалению единственная возможность гарантировать качественный код и быть действительно увереным в том, что работаете с правильным типом особенно если это косается наследственности.
Спустя 6 дней, 17 часов, 10 минут, 48 секунд (28.06.2010 - 11:35) linker написал(а):
Люди, запомните, PHP - не строго типизированный язык. Поэтому вопросы, а как типизировать ретурн - бесполезны. Юзайте instanceof и будет вам счастье. Хотя и тут есть нюансы, пример
Результатом будет TRUE.
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. |
я бы испугался если бы было по другому
