Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Metoda wewnątrz metody
Forum PHP.pl > Forum > PHP
daniel1302
Witam w teście na php.pl napotkałem na takie pytanie.
I czy może mi ktoś wytłumaczyć jak to wygląda, ja sobie uświadamiam, że to takie coś


  1. <?php
  2. Class Klasa
  3. {
  4. function metoda1()
  5. {
  6. function metoda2()
  7. {}
  8. }
  9. }
  10. ?>


Oto pytanie
Klasa posiada metodę z metodą wewnątrz niej. Jak możemy się odwołać do metody ujętej w innej metodzie?
$klasa->metoda1().metoda2()
$klasa.metoda1().metoda2()
$klasa->fmetoda1(metoda2())
$klasa->metoda1()->metoda2() - Ja to zaznaczyłem.
daniel1302
To musi być któreś z tych rozwiązań
$klasa->metoda1().metoda2()
$klasa.metoda1().metoda2()
$klasa->fmetoda1(metoda2())
$klasa->metoda1()->metoda2()
#luq
Przecież metoda nie może mieć metody. Musisz stworzyć obiekt
  1. <?php
  2. class Object2
  3. {
  4.    public function bar(){
  5.         echo 'bla';
  6.    }
  7. }
  8.  
  9. class Object
  10. {
  11.    public foo;
  12.    
  13.    public function __construct(){
  14.        $this->foo= new Object2();
  15.    }
  16. }
  17.  
  18. $o = new Object();
  19. $o->foo->bar();
  20. ?>


//edit
zapomniałem function wstydnis.gif
#luq
Powiem szczerze o takim czymś nie wiedziałem.

Co nie znaczy, że mylę się pisząc:
Cytat
metoda nie może mieć metody

Metody mogą mieć tylko obiekty a, że metoda nie jest obiektem nie może mieć metod.

Tak samo działa i takie coś:
  1. <?php
  2. function a(){
  3.    function b(){
  4.        echo 'bla';
  5.    }
  6. }
  7.  
  8. a().b();
  9. ?>

I co w tym wypadku? Funkcja ma metodę?
belliash wytłumacz mi w, którym miejscu napisałem bzdurę/bzdury?

Co do tego odwoływania się do funkcji, funkcji to jakoś przypomina mi to C++. Tam do zmiennej obiektowej odwołujemy się przez operator kropki, natomiast jak mamy wskaźnik to przez strzałkę (->). W PHP jest na odwrót z tego wynika. Myślałem, że w PHP nie ma wskaźników jako takich. Czyli w PHP jest tak jak np. w C++, funkcja jest wskaźnikiem do miejsca, gdzie ona jest zapisana, i możemy to w jakiś sposób wykorzystać? Ogólnie, mógłby wytłumaczyć mi ktoś ten zapis z kropką? Na jakiej zasadzie to działa.
#luq
Cytat(belliash @ 11.04.2009, 20:17:20 ) *
Nie mniej jednak @#luq przepraszam bo nie zrozumielismy sie z mojej winy sciana.gif

Urazy nie czuję winksmiley.jpg Mało się spotyka ludzi, którzy umieją się przyznać do błędu, więc za to Cie szanuję.

Cytat
$klasa->metoda1().metoda2(); bo w chwili wykonania metody metoda1() zostanie w global scope utworzona funkcja o nazwie metoda2() i mozna ja zwyczajowo wykonac:

$klasa->metoda1();
metoda2();


To jest dla mnie zrozumiała. Dopiero po pierwszym wywołaniu funkcji, jej kod jest wykonywany, a więc i funkcja b() jest dopiero w tym momencie deklarowana:
  1. <?php
  2. function a(){
  3.        function b(){
  4.            echo 'bla';
  5.        }
  6.    }
  7.  
  8.    // b(); <- nie zadziała
  9.    a();
  10.    b();  // tu już zadziała
  11. ?>


Korzystając z poprzedniej funkcji, dlaczego przy wywołaniach:
  1. <?php
  2. a();
  3. a().b();
  4. b();
  5. ?>


Wyskakuję:
Kod
<b>Fatal error</b>:  Cannot redeclare b()

Przecież, ja nie redeklaruję funkcji b(); blinksmiley.gif

Może ktoś wytłumaczyć za co odpowiada kropka w zapisie
  1. <?php
  2. a().b();
  3. ?>

Bo konkatenacja, to to nie jest tongue.gif
#luq
Cytat(belliash @ 11.04.2009, 20:51:02 ) *
Redeklarujesz winksmiley.jpg

a(); -> deklarujesz;
a().b(); -> redeklarujesz smile.gif

Yhm... inaczej na to patrzałem smile.gif Myślałem, że:
Kod
a().b();

wywołuje tylko funkcje b(), a jest tak jak mówisz:
Kod
a().b();

To to samo co:
Kod
a();
b();
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.