Надо в классе обработать вот такую цепочку $Class->name1->name2 Как это сделать? Понимаю что через __get и __set, но как правильно это сделать? Самое главное что я не пойму, как это все по порядку пройти, и вывести конечный результат name2 Вот набросок класса, да он работает, но для свойства name1, а если есть name2 то должна получиться такая формула A = B B = A A = RESULT Код (Text): class RTTIClass { public function __call($Name, ...$Args) { if ($this->SelfObj !== null && $this->GetObj !== null) return InvokeMethodWPD($this->SelfObj, $Name, $Args[0], $this->GetObj); else return [0, 0]; } public function __get($Name) { $Get = $this->WPD__Get($Name); return $Get; } private function WPD__Get($Name) { if ($this->SelfObj !== null && $this->GetObj !== null) { $Result = PropertiesValueWPD($this->GetObj, $Name); if($Result === false) { $Result = PropertiesValueWPD($this->SelfObj, $Name); if($Result === false) return [0, 0]; } } return $Result; } }
может методы хочешь вызывать? Последний метод и будет возвращать информацию. $html->add('div')->add_text('test')->render(); render всегда последним вызывай
Нет, мне надо обработать все в ручную. То есть, к примеру есть $Result = PropertiesValueWPD(PropertiesValueWPD($Class->SelfObj, 'name1'), 'name2'); Вот я и хочу, через классы, сделать аналог
Так будет понятней ? $a = PropertiesValueWPD($Class->SelfObj, 'name1'); $b = PropertiesValueWPD($a, 'name2'); Суть в том, что бы получить значения метода name1, а если мы в цепочке запрашиваем и name2, то от результата name1 мы должны получить конечный результат name2
Да нет, вы не поняли, это мой класс, я его пишу, с нуля. И мне надо по цепочке получить конечное значения. Формула A = B B = A A = RESULT Реализация в функциональном виде Код (Text): $a = PropertiesValueWPD($Class->SelfObj, 'name1'); $b = PropertiesValueWPD($a, 'name2'); А нужно, через класс Код (Text): $b = $Class->name1->name2; Результаты должны быть одинаковы А я не могу по цепочки узнать name2, если тока так Код (Text): public function __get($name) { echo $name; return $this; } Но это будет не лояльна, правильно
Ну я не знаю как определить вызвали $Class->name1 или $Class->name1->name2 по этому и предложил вариант $Class->name1()->end(); и $Class->name1()->name2()->end(); как $b будет использована потом? что она должна получать? $b = $Class->name1->name2;
Определить что вызвали name1 можно, и можно name2, если в функции __get указать return $this; То есть, рекурсией. А она мне не нужна. name2 должна вернуть что и name1, обычный массив [Значения, Тип значения] Тип значения может быть как и класс, так и обычные типы, определения по цифровано, 7 и 19 это классы, а все остальные цифры кроме 0, это простые типы. И мне надо не от методов узнать значения, а от свойств. Как у меня в классе уже реализован вызов методов Код (Text): public function __call($Name, ...$Args) { if ($this->SelfObj !== null && $this->GetObj !== null) return InvokeMethodWPD($this->SelfObj, $Name, $Args[0], $this->GetObj); else return [0, 0]; }
А как по другому сделать? Я знаю пример только с echo и магическим методом __toString() https://en.wikipedia.org/wiki/Method_chaining#PHP Код (PHP): class Person { protected $name; protected $age; public function setName($name) { $this->name = $name; return $this; } public function setAge($age) { $this->age = $age; return $this; } public function __toString() { return "Hello, my name is ".$this->name." and I am ".$this->age." years old."; } } $person = new Person; echo $person->setName("Peter")->setAge(21); // echo on object automatically calls magic method __toString() Ещё один вариант без возврата значения, то есть нужно использовать что-то на подобии $b->get_result() https://ru.wikipedia.org/wiki/Fluent_interface#PHP --- придумал говнокод через сериализацию, echo и ob_start(), но нафиг это надо.
Так этого ничего в классе не определенно, и делается все динамкой, запросами в адреса памяти. А классы нужны для облегченного использования, у меня есть кое какая идея, если она правильно будет работать, отпишу.
Ты php знаешь? Знаешь как работает __get ? Я писал уже про рекурсию, и это не совсем то. ---------------------- У меня опять бред получился, сам не очень знаю, как сделать.
Я ясно дал понять, в чем мне нужна помощь, а вы пытаетесь мне втюхать, что мне как раз таки не нужно.
Чтобы сработала такая цепочка, первый __get должен вернуть либо экземпляр класса, содержащий поле $name2, либо экземпляр класса, метод __get() которого готов вернуть значение для $name2
Как будет лучше, всего реализовать? Мне хотелось бы вернуть прямой результат, то есть, запросил name1->name2 и от name1 он получил значения name2, и отдал мне его, без каких либо приключений
так не бывает. Программа исполняется последовательно. Вы мало кода дали. Не ясно, что такое PropertiesValueWPD и т.п.
Функция PropertiesValueWPD написана на другом языке, он получает данные из памяти, своего процесса. Взращивает массив, я уже писал - обычный массив [Значения, Тип значения] Тип значения может быть как и класс, так и обычные типы, определения по цифровано, 7 и 19 это классы, а все остальные цифры кроме 0, это простые типы. И почему так не бывает? Это можно сделать. Я на 100% Уверен
Вот я о таком говорил Код (Text): Class Test { public function d2($this2 = null, $n = null) { if($this2 !== null && $n !== null) { $this2->{$n} = random(3432); return $this; } } public function __get($name) { $d = new Test; return $d->d2($this, $name); } public function __set($name, $v) { Showmessage(array($name, $v)); } } $N = new Test; $s = $N->name1->name2->name3; Showmessage($s); Вообщем, осталось метод set допелить
Ну как бы вот Код (Text): Class Test { public $Get; public function __get($Name) { $this->{$Name} = random(434); //$this->WPD__Get($Name); return $this; } public function __set($name, $v) { Showmessage(array($name, $v)); } } $N = new Test; $N->name1->name2->name3 = 3; $s = $N->name1->name2->name3; Showmessage($s); А смысл я уже написал, для чего мне это надо. Хи такие не внимательные)) Добавлено спустя 21 минуту 11 секунд: Тока я не понимаю, как из под Set вернуть значение, а не класс