методы — позволяют PHP-функции вызываться динамически и статически

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

Например:

$results = Class::where('something')
->where('something else');

В этом случае метод «где» должен вызываться статически и динамически, и при этом все же разрешается цепочка.

Я знаю, что у Laravel есть что-то подобное с Eloquent, но я не знаю, как реализовать что-то подобное.

0

Решение

Просто из чистого интереса я нашел способ сделать это с помощью __call а также __callStatic и установка методов, которые вы хотите вызвать, недоступными для вызывающей их области (т.е. установите методы как private или же protected).

Важное предупреждение: С помощью __call или же __callStatic может привести к неожиданному поведению! Первое чтение Вот чтобы убедиться, что вы понимаете это. Приведенный ниже код динамически выполняет методы закрытого класса, вызываемые извне класса, поэтому вы должны быть уверены, что в белый список включены конкретные методы, к которым вы хотите добавить это поведение. Могут быть и другие проблемы с безопасностью, с которыми я не справился, поэтому используйте их на свой страх и риск.

class MethodTest
{

private static $obj;
private $fruit = 'watermelon';

private function handleDynamicCallType($name, $arguments)
{
switch ($name) {
case 'method1':
case 'method2':
$this->{$name}($arguments);
break;
default:
throw new Exception("Invalid name");
}
}

private function method1() {
echo $this->fruit . ' ';
}

private function method2() {
$arg_list = func_get_args();
if (!empty($arg_list[0][0])) {
$this->fruit = $arg_list[0][0];
}
}

public function __call($name, $arguments)
{
$this->handleDynamicCallType($name, $arguments);
return $this;
}

public static function __callStatic($name, $arguments)
{
if (!isset(self::$obj)) {
self::getNewStaticInstance();
}
self::$obj->{$name}($arguments);
return self::$obj;
}

public static function getNewStaticInstance()
{
self::$obj = new MethodTest();
return self::$obj;
}
}

$obj = new MethodTest;
$obj->method1()::method2('orange')->method1();
echo PHP_EOL;
MethodTest::method1()->method2('plum')::method1();

Выход:

watermelon orange
orange plum

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

MethodTest::method1()::method2('plum')::method1()::getNewStaticInstance()::method1();

Выход:

watermelon plum watermelon
0

Другие решения

Я просто удивился, доказав, что это является действительно возможно:

<?php
class Test {
private static $myself;
public function do() {
echo isset($this) ? 'd' : 's';
if (!isset(self::$myself)) {
self::$myself = new self;
}
return self::$myself;
}
public static function done() {
echo PHP_EOL;
}
}
Test::do()->do()->do()->done();
$myTest = new Test;
$myTest->do()->do()->do()->done();
$myTest::do()->do()->do()->done();
$myTest::do()->do()::do()->done();
Test::do()->do()->do()->done();

Выход:

sdd
ddd
sdd
sds
sdd

Но это невероятно плохой стиль в моих глазах …

2

По вопросам рекламы [email protected]