Есть ли "красивый" способ вызова функций статически?

12
PN
На сайте с 22.08.2012
Offline
103
593

Добрый день. Поясню вопрос. Есть некий класс


class Test
{
private $data;

public static function action()
{
// действия
}
}

К методу можно обратиться и так, и так:


Test::action()
$test = new Test;
$test->action;

Но в случае статического вызова нельзя использовать $this, а нужно! Я нашел выход из этой ситуации (создание экземпляра класса в случае статического вызова) и все работает, просто интересно, как бы Вы реализовали такое?

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
VHS
На сайте с 28.09.2007
Offline
142
VHS
#1

Вот объяснил, так объяснил.... Ничего не понятно...

Лучше прочти про паттерн Singleton

Оптимизайка
На сайте с 11.03.2012
Offline
396
#2
proksey-net:
Но в случае статического вызова нельзя использовать $this, а нужно!

Значит, вам не нужен статический метод. То, что php допускает форму вызова через "->", это его ошибка дизайна.

Я нашел выход из этой ситуации (создание экземпляра класса в случае статического вызова) и все работает, просто интересно, как бы Вы реализовали такое?

Смотря для чего.

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
PN
На сайте с 22.08.2012
Offline
103
#3
Оптимизайка:
Смотря для чего.

Для упрощения вызова методов.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#4

Чем сложнее object->method() чем class::method() не понимаю.

PN
На сайте с 22.08.2012
Offline
103
#5
Оптимизайка:
Чем сложнее object->method() чем class::method() не понимаю.

Так сделано в некоторых фреймворках:


User::where(1)

вместо


User::get_instance()->where(1)
djdiplomat
На сайте с 05.08.2009
Offline
136
#6

Я прошу прощения, если не по делу. Может вы про статические связки спрашиваете?

self:: случайно не решит вашу проблему?

или вот тут может поможет http://www.php.net/manual/ru/language.oop5.late-static-bindings.php

Оптимизайка
На сайте с 11.03.2012
Offline
396
#7
proksey-net:
Так сделано в некоторых фреймворках:

User::where(1)

вместо

User::get_instance()->where(1)

А что возвращает метод where? Экземпляр User, наверное? Т.е. это паттерн builder, который отвечает за создание объекта (порождающий), get_instance там не нужен, всё верно. Если условий несколько, то второй where наверное будет всё же через "->" в этих некоторых фреймворках.

PN
На сайте с 22.08.2012
Offline
103
#8
Оптимизайка:
А что возвращает метод where? Экземпляр User, наверное? Т.е. это паттерн builder, который отвечает за создание объекта (порождающий), get_instance там не нужен, всё верно. Если условий несколько, то второй where наверное будет всё же через "->" в этих некоторых фреймворках.

да, возвращает экземпляр User (return $this).

я как раз про то и говорю, что первый where вызывается через ::, а второй - через ->. Очень удобно, но это нужно реализовывать :)

Оптимизайка
На сайте с 11.03.2012
Offline
396
#9
proksey-net:
да, возвращает экземпляр User (return $this).
я как раз про то и говорю, что первый where вызывается через ::, а второй - через ->. Очень удобно, но это нужно реализовывать :)

Тогда непонятна фраза в первом сообщении:

Но в случае статического вызова нельзя использовать $this, а нужно!

зачем?


<?php

class UserBuilder {
public function where($where) {
$this->where .= $this->where ? " AND $where " : " $where ";
return $this;
}
public function get() {
return new User($this->where . ' LIMIT 1');
}
private $where;
}

class User {
public function __construct($sql) {
$this->sql = $sql;
}
public static function where($where) {
$builder = new UserBuilder();
$builder->where($where);
return $builder;
}
public function show() {
echo "SELECT * FROM user WHERE {$this->sql}";
}
private $sql;
}

$user = User::where("active = 1")->where("dumb = 0")->where("admin = 0")->get();
$user->show();
PN
На сайте с 22.08.2012
Offline
103
#10
Оптимизайка:
Тогда непонятна фраза в первом сообщении:


зачем?


<?php

class UserBuilder {
public function where($where) {
$this->where .= $this->where ? " AND $where " : " $where ";
return $this;
}
public function get() {
return new User($this->where . ' LIMIT 1');
}
private $where;
}

class User {
public function __construct($sql) {
$this->sql = $sql;
}
public static function where($where) {
$builder = new UserBuilder();
$builder->where($where);
return $builder;
}
public function show() {
echo "SELECT * FROM user WHERE {$this->sql}";
}
private $sql;
}

$user = User::where("active = 1")->where("dumb = 0")->where("admin = 0")->get();
$user->show();

спасибо!

я правда решил эту проблему с помощью трейтов и без функций-оберток:)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий