Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]function __call - może ktoś wyjaśni
Forum PHP.pl > Forum > Przedszkole
MESSIAH :)
Szukam wyjaśnienia funkcji __call. Wiem że ona woła obiekty następne po niej i w sposób niejawny je może przeładować czyli edytować w locie. Znalazłem taki kod lecz nie za bardzo go rozumiem - nie wiem czy jest on poprawny:
  1.  
  2. class MethodTest {
  3.  
  4. public $xy = NULL;
  5.  
  6. public function __call($name, $arguments)
  7. {
  8. $arguments = (array) $arguments;
  9. $arguments['dsd'] = 'mt';
  10. $fname = 'pots'.ucfirst($name); /*dodaje przedrostek "pots" i podnosi pierwszą literę*/
  11. echo $arguments;
  12.  
  13. return $this->xy->$fname($arguments);
  14. }
  15. }
  16.  
  17. $obj = new MethodTest;
  18. $obj->runTest();

Mam pytanie dlaczego (array) jest w nawiasach zwracając tym samym NULL?

Wypluwa taki błąd:
Cytat
Notice: Array to string conversion in C:\xampp\htdocs\Untitled-2.php on line 11
Array
Fatal error: Call to a member function doRunTest() on null in C:\xampp\htdocs\Untitled-2.php on line 13
Turson
Skoro $arguments jest tablicą to jak chcesz ją echo-wać?
Forti
  1.  
  2. class MethodTest {
  3.  
  4. public $xy = NULL;
  5.  
  6. public function __call($name, $arguments)
  7. {
  8. $arguments = (array) $arguments;
  9. $arguments['dsd'] = 'mt';
  10. $fname = 'pots'.ucfirst($name); /*dodaje przedrostek "pots" i podnosi pierwszą literę*/
  11. echo $arguments;
  12.  
  13. return $this->xy->$fname($arguments);
  14. }
  15. }
  16.  
  17. $obj = new MethodTest;
  18. $obj->runTest();


Jeżeli się nie mylę...

_call jest wywoływana gdy wywolujesz nie istniejącą metodę. RunText() nie istnieje, więc wykonuje się __call, w którym zwracasz $this->xy, które jest NULL.

Czego nie rozumiesz?


edit:

  1. $arguments = (array) $arguments;


oznacza tyle, że $arguments musi być typu array. - mogę się mylić ;]
MESSIAH :)
Cytat(Turson @ 5.01.2015, 21:30:58 ) *
Skoro $arguments jest tablicą to jak chcesz ją echo-wać?

Bo chcę wyświetlić zawartość zmiennej. Zmieniłem na print_r i działa.

Cytat(Forti @ 5.01.2015, 21:33:41 ) *
  1.  
  2. class MethodTest {
  3.  
  4. public $xy = NULL;
  5.  
  6. public function __call($name, $arguments)
  7. {
  8. $arguments = (array) $arguments;
  9. $arguments['dsd'] = 'mt';
  10. $fname = 'pots'.ucfirst($name); /*dodaje przedrostek "pots" i podnosi pierwszą literę*/
  11. echo $arguments;
  12.  
  13. return $this->xy->$fname($arguments);
  14. }
  15. }
  16.  
  17. $obj = new MethodTest;
  18. $obj->runTest();


Jeżeli się nie mylę...

_call jest wywoływana gdy wywolujesz nie istniejącą metodę. RunText() nie istnieje, więc wykonuje się __call, w którym zwracasz $this->xy, które jest NULL.

Czego nie rozumiesz?


edit:

  1. $arguments = (array) $arguments;


oznacza tyle, że $arguments musi być typu array. - mogę się mylić ;]

Czyli (array) oznacza iż zmienna musi mieć taki typ? Nawet jak usunę NULL ze zmiennej to jest ten sam efekt bez różnicy czy jest wartość czy jej nie ma. Więc mam rozumieć że __call służy do nie istniejących metod?
Turson
(array) to jest rzutowanie do tablicy.

Cytat
Bo chcę wyświetlić zawartość zmiennej

Ale to jest tablica. Po co bierzesz się za __call() jak nie znasz podstaw tablic.
Zobacz masz: $arguments['dsd'] = 'mt';
więc to tablica, a tablic nie wyświetla się echo $nazwaTablicy
MESSIAH :)
Pytam bo interesuję sie OOP i znam schemat działania funkcji oraz klasy. A dopierod dzisiaj spotkałem się z (array) dlatego mnie to ciekawiło bo zawsze widziałem array( 'wartość' => przekierowanie) Czyli robiąc (array) rzutuję do nieistniejącej tablicy? Więc jak powinien wglądać przykład aby został dodany array do RunTest?

Przeszukałem google pod względem otrzymanego błędu i otrzymałem wyniki do CMSów oraz frameworków. Mało jest wyników na ten temat.
mls
__call i (array) to dwa całkowicie odrębne i niepowiązane tematy.
Opis __call masz w dokumentacji.
Opis (array) również, i to są podstawy:
Cytat
In other words, (array)$scalarValue is exactly the same as array($scalarValue).
MESSIAH :)
Cytat
In other words, (array)$scalarValue is exactly the same as array($scalarValue).


Niestety (array)$var to nie to samo co array ($var)

Jak widać w moim przykładzie mam funkcję __call, która nadpisuje metody zdefiniowane później i dodaje wartości z $arguments:
  1. $arguments = (array) $arguments[0];

I gdy zmienię ten kod na przykład podany z cytatu:
  1. array($arguments[0])

Nie zostaną prawidłowo dodane argumenty.

Sądzę że istnieje jakaś różnicy między (array) a array().
Pyton_000
Cytat(MESSIAH :) @ 9.01.2015, 23:08:46 ) *
Niestety (array)$var to nie to samo co array ($var)


A wg. mnie tak. Dowód:
Kod:
  1. <?php
  2.  
  3.  
  4. echo '<pre>';
  5. $scalar = 'sting';
  6. var_dump((array)$scalar);
  7. var_dump(array($scalar));
  8.  
  9. echo '========='.PHP_EOL;
  10.  
  11. $scalar = array('sting');
  12. var_dump((array)$scalar[0]);
  13. var_dump(array($scalar[0]));


Wynik:
Kod
array(1) {
  [0]=>
  string(5) "sting"
}
array(1) {
  [0]=>
  string(5) "sting"
}
=========
array(1) {
  [0]=>
  string(5) "sting"
}
array(1) {
  [0]=>
  string(5) "sting"
}
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.