[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Method Chaining / Метод цепочки
Семён
С этим методом знаком совсем недавно.


Рассмотрим стандартную ситуацию
public function createArray() {
$this->array = array("lemonad");
return $this;
}
public function getArray() {
//Какое-то преобразование с массивом.
return $this->array;
}


Вызовем:
$myClass->createArray()->getArray();

Стало интересно как реализовать такое, чтобы можно вернуть массив createArray в том виде который, он был, а если добавлен вызов getArray вернуть его в преобразованном.
т.е.:
$myClass->createArray(); //Вернёт исходный массив

$myClass->createArray()->getArray(); //Вернёт преобразованный массив




Спустя 1 час, 1 минута, 36 секунд (3.05.2011 - 09:39) Oyeme написал(а):
Можно что-то типо такого:

class test {
public function createArray() {
$this->array = array("lemonad");
return $this;
}
public function getArray() {
$r = array();
$r = $this->array;
$r[] = 'June';
return $r;
}
}

$test = new test();
print_r($test->createArray());
print_r($test->createArray()->getArray());

В этом случаю каждый раз при вызове метода getArray(),он преобразуется.

Спустя 3 минуты, 47 секунд (3.05.2011 - 09:43) Семён написал(а):
Но ведь $myClass->createArray(); не вернёт массив, массив вернётся после вызова только getArray, есть ли какая-нибудь проверка на вызов функций в классе?

Спустя 20 минут, 47 секунд (3.05.2011 - 10:03) Oyeme написал(а):
$test->createArray()->array

Спустя 1 минута, 31 секунда (3.05.2011 - 10:05) Семён написал(а):
Не катит, проще тогда в createArray() передать аргумент SingleCall и проверять его в функции. хочется в автомате. на уровне вызова функций проверять

Спустя 17 секунд (3.05.2011 - 10:05) T1grOK написал(а):
Можно добавить метод, который будет возвращать оригинальный массив или использовать интерфейс для доступа к объекту как к массиву.

Спустя 42 секунды (3.05.2011 - 10:06) pyha_coder написал(а):
А если сделать так?


class test {

public $array;

public function createArray($return = false) {

$this->array = array("lemonad");

if($return === false){
return $this;
}

return $this->array;
}

public function getArray() {


return $this->array;
}
}



$class = new test();

var_dump($class->createArray(true));
var_dump($class->createArray()->getArray());

Спустя 7 секунд (3.05.2011 - 10:06) Семён написал(а):
T1grOK
Менять структуру кода придётся. не катит )))

Спустя 1 минута, 31 секунда (3.05.2011 - 10:08) Семён написал(а):
pyha_coder вооо чуть выше про это написал ))) но хотелось бы на уровне вызова списка функций решить это както, вроде если функция была вызвана return, способ с передачей аргумента, оставлю на самый последок.

Спустя 8 минут, 50 секунд (3.05.2011 - 10:16) pyha_coder написал(а):
М. даже и не знаю, а если вот так или подобный код не премлем.? магию применить.


class test {
public $array;

public function createArray($return = false) {

$this->array = array("lemonad");

if($return === false){
return $this->array;
}
return $this;
}

public function getArray() {
return $this->array;
}

public function __get($name){
return $this->createArray(true);
}
}



$class = new test();

var_dump($class->createArray());

var_dump($class->createArray->getArray());

Спустя 2 минуты, 56 секунд (3.05.2011 - 10:19) Семён написал(а):
pyha_coder
Интересно, но как быть если в практике у меня в CreateArray ещё и передаётся аргумент? )))

Спустя 3 минуты, 8 секунд (3.05.2011 - 10:22) pyha_coder написал(а):
ну вот если будешь вызывать в цепочке то
$class->createArray->getArray()

если только createArray тогда
$class->createArray(/* параметры */)



а у тебя же еще в создание массива может передаваться да? тогда этот вариант не подходит.

Спустя 4 минуты, 23 секунды (3.05.2011 - 10:27) Семён написал(а):
Я просто в этой темке, такой пример с cозданием массива приложил, в практике 1-ая функция принемает параметры, делает операцию на выходе создаётся массив, в некоторых случаях нужно получить опр. часть, а в некоторых полную. smile.gif Хотелось просто дописать функцию, не затрагивая особо 1-ую функцию smile.gif

Спустя 1 минута, 15 секунд (3.05.2011 - 10:28) pyha_coder написал(а):
можешь кинуть пример с которым ты работаешь? есть еще пара идеек, но лучше оперировать на твоем рабочем коде. Раньше не задумывался об это, сейчас самому стало интересно))))

Спустя 12 минут, 26 секунд (3.05.2011 - 10:41) Семён написал(а):
Ну вот пример из проекта:
$total= $this->mysql->QueryS("COUNT(username) as total_users ..............");

на выходе даст массив
В коде проскакивают записи вроде:
$total= $result[0]['total_users'];

А хотелось бы свести всё к виду
$total= $this->mysql->QueryS("COUNT(username) as total_users ..............")->get('total_users');

Спустя 5 минут, 54 секунды (3.05.2011 - 10:46) Семён написал(а):
В Кохане, это реализовано, но я не пойму как )

Спустя 43 минуты, 15 секунд (3.05.2011 - 11:30) T1grOK написал(а):
Может все таки интерфейсы. rolleyes.gif

Спустя 10 минут (3.05.2011 - 11:40) linker написал(а):
Семён
В Кохане оно может и реализовано, но ты не допёр, что отдают тебе объект, в котором реализованы методы интерфейсов Iterator и ArrayAccess, которые дают возможность работать с объектом как с массивом (я точно не знаю, как Кохана это делает, но я бы сделал как-то так). Пример
class Array implements Iterator, ArrayAccess
{
// реализация
}

$array = new Array();
$array['key'] = 'value';
foreach($array as $key => $value)
echo $key . ' => ' . $value;

Спустя 35 минут, 55 секунд (3.05.2011 - 12:16) Семён написал(а):
linker умно сказано не нехрена непонятно.

Спустя 13 минут, 48 секунд (3.05.2011 - 12:29) linker написал(а):
Семён
Ну посмотри на пример, обрати внимание, что $array - это объект класса Array. А потом чуть ниже увидишь, что с этим объектом, я обращаюсь как с массивом
$array['key'] = 'value';
и
foreach($array as $key => $value)
можно даже так
$array[] = 'value';
подобного поведения позволяют добиться указанные интерфейсы. Об их реализации можно почитать на php.net, тут http://ru2.php.net/manual/en/class.arrayaccess.php и тут http://ru2.php.net/manual/en/class.iterator.php

Спустя 6 минут, 50 секунд (3.05.2011 - 12:36) Семён написал(а):
оп оп )) спасибо
Быстрый ответ:

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