Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]function __call - może ktoś wyjaśni
MESSIAH :)
post
Post #1





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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


Ten post edytował MESSIAH :) 5.01.2015, 21:34:50
Go to the top of the page
+Quote Post
Turson
post
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Skoro $arguments jest tablicą to jak chcesz ją echo-wać?
Go to the top of the page
+Quote Post
Forti
post
Post #3





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

Ostrzeżenie: (0%)
-----


  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ć ;]

Ten post edytował Forti 5.01.2015, 21:35:13
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #4





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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?

Ten post edytował MESSIAH :) 5.01.2015, 21:41:23
Go to the top of the page
+Quote Post
Turson
post
Post #5





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


(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
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #6





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował MESSIAH :) 5.01.2015, 22:11:14
Go to the top of the page
+Quote Post
mls
post
Post #7





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


__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).


Ten post edytował mls 6.01.2015, 19:01:44
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #8





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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().
Go to the top of the page
+Quote Post
Pyton_000
post
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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"
}
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 12:34