Рассмотрим стандартную ситуацию
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 ещё и передаётся аргумент? )))
Интересно, но как быть если в практике у меня в CreateArray ещё и передаётся аргумент? )))
Спустя 3 минуты, 8 секунд (3.05.2011 - 10:22) pyha_coder написал(а):
ну вот если будешь вызывать в цепочке то
если только createArray тогда
а у тебя же еще в создание массива может передаваться да? тогда этот вариант не подходит.
$class->createArray->getArray()
если только createArray тогда
$class->createArray(/* параметры */)
а у тебя же еще в создание массива может передаваться да? тогда этот вариант не подходит.
Спустя 4 минуты, 23 секунды (3.05.2011 - 10:27) Семён написал(а):
Я просто в этой темке, такой пример с cозданием массива приложил, в практике 1-ая функция принемает параметры, делает операцию на выходе создаётся массив, в некоторых случаях нужно получить опр. часть, а в некоторых полную.
Хотелось просто дописать функцию, не затрагивая особо 1-ую функцию
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
![smile.gif](http://phpforum.ru/html/emoticons/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](http://phpforum.ru/html/emoticons/rolleyes.gif)
Спустя 10 минут (3.05.2011 - 11:40) linker написал(а):
Семён
В Кохане оно может и реализовано, но ты не допёр, что отдают тебе объект, в котором реализованы методы интерфейсов Iterator и ArrayAccess, которые дают возможность работать с объектом как с массивом (я точно не знаю, как Кохана это делает, но я бы сделал как-то так). Пример
В Кохане оно может и реализовано, но ты не допёр, что отдают тебе объект, в котором реализованы методы интерфейсов 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 - это объект класса 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) Семён написал(а):
оп оп )) спасибо