gam0ra
26.05.2015 - 21:55
Всем привет)
Есть такой вот код))
class User
{
public static $name;
public static $fam;
public function setName($name)
{
self::$name = $name;
return $this;
}
public function setFam($fam)
{
self::$fam= $fam;
return $this;
}
public function __call($name,$pr){
echo $name;
}
}
User::setName('Pavel')->setFam('Durov');
echo User::$name;
echo User::$fam;
И такая вот ошибка
Fatal error: Call to a member function setFam() on a non-object in
Я думаю что вместо $this нужно вернуть self:: и сделать методы статичными Но в таком виде self:: не вернуть будет ошибка
Подскажите как реализовать такое?
User::setName('Pavel')->setFam('Durov');
Как вариант внедрить в класс getInstance синглтона и возвращать $Instance.
_____________
Трус не играет в хокей
ApuktaChehov
27.05.2015 - 00:25
Нужно создать приватное статическое свойство класса, которое будет содержать в себе экземпляр этого класса. В setName в самом начале проверить, содержит ли оно объект, если нет, то создать экземпляр класса и записать в него. После setName должен возвращает это свойство. Это классический синглтон выходит. Хотя можно просто вернуть экземпляр класса. Но это же класс юзера, и на одного юзера должен быть только один экземпляр. По этому синглтон.
Например:
public static function setName($name)
{
if(!self::$intance)
self::$intance = new self;
self::$name = $name;
return self::$intance;
}
_____________
Michael
27.05.2015 - 07:31
не нужна тебе тут эта статика.
_____________
There never was a struggle in the soul of a good man that was not hard
gam0ra
27.05.2015 - 11:04
stumpApuktaChehovreturn new self помог))
class User
{
public static $name;
public static $fam;
public function setName($name)
{
self::$name = $name;
return new self;
}
public function setFam($fam)
{
self::$fam= $fam;
return new self;
}
public function __call($name,$pr){
echo $name;
}
}
User::setName('Pavel')->setFam('Durov');
echo User::$name;
echo User::$fam;
PavelDurov
ApuktaChehov
27.05.2015 - 13:25
Обратите внимание:
User::setName('Pavel') - вернет один экземпляр класса User
User::setName('Pavel')->setFam('Durov') - вернет другой экземпляр класса User.
Вы тут создаете 2 разных экземпляра класса.
И я даже не спрашиваю, почему вы именно так спроектировали этот класс.
_____________
gam0ra
27.05.2015 - 14:08
ApuktaChehov
А это плохо?)
Цитата |
public static function setName($name) { if(!self::$intance) self::$intance = new self;
self::$name = $name; return self::$intance; }
|
Я тут вот моленечко не понял)
Цитата (gam0ra @ 27.05.2015 - 10:08) |
А это плохо?) |
откровенно говоря - это лютый говнокод. Вообще не понятно зачем может понадобится такая реализация. Что ты будешь делать если тебе понадобится создать 2 пользователя в одном сценарии? Зачем вообще обращаться к статичным публичным свойствам через методы объекта и т.д.
Цитата (gam0ra @ 27.05.2015 - 10:08) |
Я тут вот моленечко не понял) |
gam0ra
27.05.2015 - 15:06
kaww
Это не для создания пользователей в сценарии пользователей))просто для примера показал
ApuktaChehov
27.05.2015 - 18:58
Плохо. Класс, это шаблон для создания объекта и все что включает класс должны разделять все объекты. А вы загнали имя юзера в класс. Получается, что вы создали класс только для одного юзера. А он должен создавать для все(любого).
Вообщем неправильно все это у вас.
_____________
gam0ra
27.05.2015 - 19:15
ApuktaChehovЕсли в классе user setName такой
public function setName($name){
self::$name = $name;
return new self;
}
var_dump(User::setName('Pavel')->setFam('Durov'));
echo '<br>';
var_dump(User::setName('Pavel'));
///Покажет
object(User)#2 (0) { }
object(User)#2 (0) { }
А если
public static function setName($name){
if(!self::$intance)
self::$intance = new self;
self::$name = $name;
return self::$intance;
}
var_dump(User::setName('Pavel')->setFam('Durov'));
echo '<br>';
var_dump(User::setName('Pavel'));
///Покажет
object(User)#2 (0) { }
object(User)#1 (0) { }
Почему так?)
ApuktaChehov
27.05.2015 - 19:56
var_dump(User::setName('Pavel')->setFam('Durov'));
Вот тут вы уже создали 2 объекта.
_____________
gam0ra
27.05.2015 - 20:22
ApuktaChehov
ТОесть сели больше будет цепочка и обьектов будет больше?
ApuktaChehov
27.05.2015 - 22:18
При такой конструкции, которую вы сделали да.
_____________
gam0ra
28.05.2015 - 12:55
ApuktaChehov
А какую сделать чтобы так небыло?
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.