Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP Funkcja w Funkcji ->Return String ?
Forum PHP.pl > Forum > PHP > Object-oriented programming
bidabliu88
Witam.
Czy funkcja która jest zawarta wewnątrz funkcji może prawidłowo oddawać "array" ?
za każdym razem jak próbuje dostać się do wartości które ma zwracać moja wewnętrzna funkcja , dostanie ciąg znaków (string) zamiast tablicy (array).
przykład:

  1. class Klasa{
  2. public function zewnetrzna(){
  3. function wewnetrzna(){
  4. return array("size" => "XL", "color" => "gold");
  5. }
  6. }
  7. }


przy wykonywaniu :
  1. print_r(($klasa->zewnetrzna().wewnetrzna()));

otrzymuje :
Array

zamiast podanej wyżej tablicy.

Próbowałem przetwarzać typ zmiennej którą otrzymuje na Array niestety oddaje mi to samo.

Proszę o jakąś pomoc. Zależy mi na tym, żeby wewnętrzna funkcja oddawała prawidłowo tablice danych.

pozdrawiam.
zend
Myślę że to może być to o co Ci chodzi
  1.  
  2. class x{
  3.  
  4. public function a(){$this -> b();}
  5.  
  6. protected function b() {return array();}
  7. }
  8.  


Poczytaj jeszcze troche o obiektówce. Poza tym spróbuj wywołać w razy $klasa -> zewnetrzna(); to dostaniesz błąd, takie definiowanie funkcji to duży błąd i spory problem przy debugowaniu
Crozin
1. W PHP wszystkie funkcje są globalne. Nie istnieje coś takiego jak zasięg widoczności funkcji (pomijając przestrzenie nazw).
2. Kropka (.) to operator łączenia tekstu.
3. $klasa->zewnetrzna() zwraca NULL-a, wewnetrzna() zwraca wartość globalnej funkcji, którą jest tablica.
4. Łącząc NULL-a i tablicę otrzymasz "" (pusty string) oraz "Array" (tablica zrzutowana na tekst daje taki wynik) w efekcie otrzymasz ostateczny wynik: "Array"
bidabliu88
A nie da się tego zrobić w ten sposób żeby zachować "strukturę" klasy ? jako funkcja w funkcji ?
dzięki temu mógłbym w dość specyficzny sposób ustawić funkcje np.
  1. public function get(){
  2. function cos1(){
  3. }
  4. function cos2(){
  5. }
  6. }

To burzy chyba ewidentnie mój pomysł o "strukturze" funkcji...
Crozin
Przy użyciu $obj->get()->cos1() musiałbyś sprawić by metoda (funkcja obiektu) get() zwracała inny obiekt, zawierający metodę cos1().

Dobrze by było jakbyś przybliżył co chcesz osiągnąć. Jak chcesz używać swojego kodu.
bidabliu88
W moim zamyśle było żeby z jednej funkcji odwoływać się do innych tak żeby ich struktura była "drzewiasta". Jedynym wyjściem teraz jaki widze to przerobienie ich do równoległych funkcji oraz utworzenie jakichś głównych które wykonywałyby inne np.

  1. public function get($type=null){
  2. if($type="cos1"){
  3. $this->cos1();
  4. }
  5. }
  6. public function cos1(){
  7. echo "cos 1 ";
  8. }

Hmmmmm moze to jest sposób na oddawanie innego obiektu.....
Crozin
Nie jestem pewien czy dobrze rozumiem co chcesz osiągnąć, ale może chodzi po prostu o Fluent Interface?
bidabliu88
Fluent Interface to jedna sprawa a druga to, żeby struktura pliku klasy była jak najbardziej przejrzysta. Niestety używając równolegle ułożonych funkcji jest za dużo linii kodu który potem ciężko przetwarzać. A przy "drzewiastej" strukturze widać byłoby że wykonując funkcje Get() logiczne byłoby że można wykonać funkcje np. Info().
LBO
Dodam jeszcze jako "ciekawostkę" (warto na to uważać w przyszłości, również w innych kontekstach niż klasa) - przy takim zapisie za każdym razem jak wywołujesz Klasa::zewnetrzna() to tak jakbyś od nowa deklarował funkcję wewnetrzna().
Ponieważ PHP na to nie pozwala już przy drugim wywołaniu dostaniesz fatal errorem.

Cytat(bidabliu88 @ 17.07.2011, 23:19:52 ) *
Fluent Interface to jedna sprawa a druga to, żeby struktura pliku klasy była jak najbardziej przejrzysta. Niestety używając równolegle ułożonych funkcji jest za dużo linii kodu który potem ciężko przetwarzać. A przy "drzewiastej" strukturze widać byłoby że wykonując funkcje Get() logiczne byłoby że można wykonać funkcje np. Info().


Kłania się zasada Single responsibility. W skrócie - jeżeli klasa robi za dużo refaktoryzuj ją na kilka mniejszych.
bidabliu88
Ok ok. przekonaliście mnie do tego że niestety struktura drzewiasta w OOP jest niemożliwa i kod należy optymalizować w inny sposób.
A odnośnie tego co chciałem osiągnąć to częściowo opisuje to Method Chaining.

Wyglada na to, że właśnie zapomniałem o tej metodzie (Single Responsibility). dzieki.
Crozin
Cytat
Ok ok. przekonaliście mnie do tego że niestety struktura drzewiasta w OOP jest niemożliwa i kod należy optymalizować w inny sposób.
Struktury drzewiaste jak najbardziej można reprezentować w OOP. Ale w tym przypadku po prostu nie było najprawdopodobniej dla nich w ogóle miejsca.
bidabliu88
Silly question - Więc gdzie można wykorzystać struktury drzewiaste ? albo raczej gdzie się je wykorzystuje ?
Crozin
Ciężko się odpowiada na takie pytania. wink.gif
Ogólnie wszędzie tam gdzie możesz wyszczególnić coś co jest rodzicem i dziećmi owego rodzica. Na początek dwa linki z Wiki powinny wystarczyć:
- http://en.wikipedia.org/wiki/Tree_structure
- http://en.wikipedia.org/wiki/Tree_(data_structure)
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.