[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с Текучим интерфейсом
gam0ra
Всем привет)
Есть такой вот код))
PHP CODE


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


Fatal error: Call to a member function setFam() on a non-object in

Я думаю что вместо $this нужно вернуть self:: и сделать методы статичными Но в таком виде self:: не вернуть будет ошибка
Подскажите как реализовать такое?

User::setName('Pavel')->setFam('Durov');
stump
Как вариант внедрить в класс getInstance синглтона и возвращать $Instance.

_____________
Трус не играет в хокей
ApuktaChehov
Нужно создать приватное статическое свойство класса, которое будет содержать в себе экземпляр этого класса. В setName в самом начале проверить, содержит ли оно объект, если нет, то создать экземпляр класса и записать в него. После setName должен возвращает это свойство. Это классический синглтон выходит. Хотя можно просто вернуть экземпляр класса. Но это же класс юзера, и на одного юзера должен быть только один экземпляр. По этому синглтон.

Например:

public static function setName($name)
{
if(!self::$intance)
self::$intance = new self;

self::$name = $name;
return self::$intance;
}


_____________
Michael
не нужна тебе тут эта статика.

_____________
There never was a struggle in the soul of a good man that was not hard
gam0ra
stump
ApuktaChehov
return 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
Обратите внимание:
User::setName('Pavel') - вернет один экземпляр класса User
User::setName('Pavel')->setFam('Durov') - вернет другой экземпляр класса User.
Вы тут создаете 2 разных экземпляра класса.

И я даже не спрашиваю, почему вы именно так спроектировали этот класс. wink.gif

_____________
gam0ra
ApuktaChehov
А это плохо?)
Цитата

public static function setName($name)
{
    if(!self::$intance)
        self::$intance = new self;

    self::$name = $name;
    return self::$intance;
}

Я тут вот моленечко не понял)
kaww
Цитата (gam0ra @ 27.05.2015 - 10:08)
А это плохо?)

откровенно говоря - это лютый говнокод. Вообще не понятно зачем может понадобится такая реализация. Что ты будешь делать если тебе понадобится создать 2 пользователя в одном сценарии? Зачем вообще обращаться к статичным публичным свойствам через методы объекта и т.д.

Цитата (gam0ra @ 27.05.2015 - 10:08)
Я тут вот моленечко не понял)
gam0ra
kaww
Это не для создания пользователей в сценарии пользователей))просто для примера показал
ApuktaChehov
Плохо. Класс, это шаблон для создания объекта и все что включает класс должны разделять все объекты. А вы загнали имя юзера в класс. Получается, что вы создали класс только для одного юзера. А он должен создавать для все(любого).

Вообщем неправильно все это у вас.

_____________
gam0ra
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
var_dump(User::setName('Pavel')->setFam('Durov'));

Вот тут вы уже создали 2 объекта.

_____________
gam0ra
ApuktaChehov
ТОесть сели больше будет цепочка и обьектов будет больше?
ApuktaChehov
При такой конструкции, которую вы сделали да.

_____________
gam0ra
ApuktaChehov
А какую сделать чтобы так небыло?
Быстрый ответ:

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