За последние 24 часа нас посетили 17186 программистов и 1651 робот. Сейчас ищут 1139 программистов ...

Получить цепочку свойств

Тема в разделе "Прочие вопросы по PHP", создана пользователем Tester1, 23 янв 2015.

  1. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Надо в классе обработать вот такую цепочку

    $Class->name1->name2

    Как это сделать? Понимаю что через __get и __set, но как правильно это сделать?

    Самое главное что я не пойму, как это все по порядку пройти, и вывести конечный результат name2

    Вот набросок класса, да он работает, но для свойства name1, а если есть name2 то должна получиться такая формула

    A = B
    B = A
    A = RESULT

    Код (Text):
    1.  
    2. class RTTIClass {
    3.     public function __call($Name, ...$Args) {
    4.         if ($this->SelfObj !== null && $this->GetObj !== null)
    5.             return InvokeMethodWPD($this->SelfObj, $Name, $Args[0], $this->GetObj);
    6.         else return [0, 0];
    7.     }
    8.        
    9.     public function __get($Name) {
    10.         $Get = $this->WPD__Get($Name);
    11.            
    12.         return $Get;
    13.     }
    14.  
    15.     private function WPD__Get($Name) {
    16.         if ($this->SelfObj !== null && $this->GetObj !== null) {
    17.             $Result = PropertiesValueWPD($this->GetObj, $Name);
    18.             if($Result === false) {
    19.                 $Result = PropertiesValueWPD($this->SelfObj, $Name);
    20.                 if($Result === false) return [0, 0];
    21.             }
    22.         }
    23.         return $Result;
    24.     }
    25. }
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    может методы хочешь вызывать? Последний метод и будет возвращать информацию.
    $html->add('div')->add_text('test')->render();
    render всегда последним вызывай
     
  3. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Нет, мне надо обработать все в ручную. То есть, к примеру есть

    $Result = PropertiesValueWPD(PropertiesValueWPD($Class->SelfObj, 'name1'), 'name2');

    Вот я и хочу, через классы, сделать аналог
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Не понятный пример
     
  5. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Так будет понятней ?
    $a = PropertiesValueWPD($Class->SelfObj, 'name1');
    $b = PropertiesValueWPD($a, 'name2');

    Суть в том, что бы получить значения метода name1, а если мы в цепочке запрашиваем и name2, то от результата name1 мы должны получить конечный результат name2
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    вызывай в конце ->end();
     
  7. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Да нет, вы не поняли, это мой класс, я его пишу, с нуля. И мне надо по цепочке получить конечное значения. Формула

    A = B
    B = A
    A = RESULT

    Реализация в функциональном виде
    Код (Text):
    1.  
    2. $a = PropertiesValueWPD($Class->SelfObj, 'name1');
    3. $b = PropertiesValueWPD($a, 'name2');
    А нужно, через класс
    Код (Text):
    1.  
    2. $b = $Class->name1->name2;
    Результаты должны быть одинаковы
    А я не могу по цепочки узнать name2, если тока так

    Код (Text):
    1.  
    2. public function __get($name) {
    3.     echo $name;
    4.     return $this;
    5. }
    Но это будет не лояльна, правильно
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ну я не знаю как определить вызвали $Class->name1 или $Class->name1->name2
    по этому и предложил вариант $Class->name1()->end(); и $Class->name1()->name2()->end();

    как $b будет использована потом? что она должна получать?
    $b = $Class->name1->name2;
     
  9. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0

    Определить что вызвали name1 можно, и можно name2, если в функции __get указать return $this; То есть, рекурсией. А она мне не нужна.

    name2 должна вернуть что и name1, обычный массив [Значения, Тип значения]
    Тип значения может быть как и класс, так и обычные типы, определения по цифровано, 7 и 19 это классы, а все остальные цифры кроме 0, это простые типы.

    И мне надо не от методов узнать значения, а от свойств. Как у меня в классе уже реализован вызов методов
    Код (Text):
    1.    public function __call($Name, ...$Args) {
    2.       if ($this->SelfObj !== null && $this->GetObj !== null)
    3.          return InvokeMethodWPD($this->SelfObj, $Name, $Args[0], $this->GetObj);
    4.       else return [0, 0];
    5.    }
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    может всегда возвращать класс с результатом и запрашивать его так $b->get_result(); ?
     
  11. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Нееееет! Глупа, отвратительно, мерзко.
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    А как по другому сделать?
    Я знаю пример только с echo и магическим методом __toString()

    https://en.wikipedia.org/wiki/Method_chaining#PHP

    Код (PHP):
    1.  
    2. class Person {
    3.  
    4.   protected $name;
    5.   protected $age;
    6.  
    7.   public function setName($name) {
    8.     $this->name = $name;
    9.     return $this;
    10.   }
    11.  
    12.   public function setAge($age) {
    13.     $this->age = $age;
    14.     return $this;
    15.   }
    16.  
    17.   public function __toString() {
    18.     return "Hello, my name is ".$this->name." and I am ".$this->age." years old.";
    19.   }
    20. }
    21.  
    22. $person = new Person;
    23. 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(), но нафиг это надо.
     
  13. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Так этого ничего в классе не определенно, и делается все динамкой, запросами в адреса памяти. А классы нужны для облегченного использования, у меня есть кое какая идея, если она правильно будет работать, отпишу.
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    А что мешает определить?
     
  15. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Ты php знаешь? Знаешь как работает __get ? Я писал уже про рекурсию, и это не совсем то.

    ----------------------
    У меня опять бред получился, сам не очень знаю, как сделать.
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Да не, откуда мне php знать, я только даю ссылки на документацию.
     
  17. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Я ясно дал понять, в чем мне нужна помощь, а вы пытаетесь мне втюхать, что мне как раз таки не нужно.
     
  18. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    а где-то уже используют, то что ты хочешь сделать?
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Чтобы сработала такая цепочка, первый __get должен вернуть либо экземпляр класса, содержащий поле $name2, либо экземпляр класса, метод __get() которого готов вернуть значение для $name2
     
  20. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0

    Как будет лучше, всего реализовать? Мне хотелось бы вернуть прямой результат, то есть, запросил name1->name2 и от name1 он получил значения name2, и отдал мне его, без каких либо приключений
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    так не бывает. Программа исполняется последовательно. Вы мало кода дали. Не ясно, что такое PropertiesValueWPD и т.п.
     
  22. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Функция PropertiesValueWPD написана на другом языке, он получает данные из памяти, своего процесса. Взращивает массив, я уже писал - обычный массив [Значения, Тип значения]
    Тип значения может быть как и класс, так и обычные типы, определения по цифровано, 7 и 19 это классы, а все остальные цифры кроме 0, это простые типы.


    И почему так не бывает? Это можно сделать. Я на 100% Уверен
     
  23. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Вот я о таком говорил

    Код (Text):
    1.  
    2. Class Test {
    3.     public function d2($this2 = null, $n = null) {
    4.         if($this2 !== null && $n !== null) {
    5.             $this2->{$n} = random(3432);
    6.           return $this;
    7.         }
    8.     }
    9.  
    10.     public function __get($name) {
    11.         $d = new Test;
    12.         return $d->d2($this, $name);
    13.     }
    14.  
    15.     public function __set($name, $v) {
    16.         Showmessage(array($name, $v));
    17.     }
    18. }
    19.  
    20. $N = new Test;
    21. $s = $N->name1->name2->name3;
    22. Showmessage($s);
    Вообщем, осталось метод set допелить
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Извините, но выглядит бредятина бредятиной... В чём польза?
     
  25. Tester1

    Tester1 Новичок

    С нами с:
    23 янв 2015
    Сообщения:
    15
    Симпатии:
    0
    Ну как бы вот
    Код (Text):
    1.  
    2. Class Test {
    3.     public $Get;
    4.     public function __get($Name) {
    5.         $this->{$Name} =  random(434); //$this->WPD__Get($Name);
    6.         return $this;
    7.     }
    8.  
    9.     public function __set($name, $v) {
    10.         Showmessage(array($name, $v));
    11.     }
    12. }
    13.  
    14. $N = new Test;
    15. $N->name1->name2->name3 = 3;
    16.  
    17. $s = $N->name1->name2->name3;
    18. Showmessage($s);
    А смысл я уже написал, для чего мне это надо. Хи такие не внимательные))

    Добавлено спустя 21 минуту 11 секунд:
    Тока я не понимаю, как из под Set вернуть значение, а не класс