2013-06-26 12 views
5

Czy metoda wsparcia php jest przeciążona. Podczas próby poniżej kodu sugeruje, że obsługuje on przeciążanie metod. Wszelkie widokiCzy metoda wsparcia Php jest przeciążona?

class test 
{ 
    public test($data1) 
    { 
    echo $data1; 
    } 
} 

class test1 extends test 
{ 
    public test($data1,$data2) 
    { 
     echo $data1.' '.$data2; 
    } 
} 

$obj = new test1(); 
$obj->test('hello','world'); 

Ponieważ przeciążenie metody daje wynik jako "Witaj świecie". Powyższy fragment kodu sugeruje, że metoda php obsługuje przeciążanie metod. Moje pytanie brzmi: przeciążenie metody php.

+0

Sprawdź tę odpowiedź http://stackoverflow.com/a/4697712/387194, w twoim przypadku nie używasz przeciążania, ale nadpisywania. Stara funkcja nie jest wykonywana, jeśli napiszesz '$ obj-> test (" cześć ");' – jcubic

+0

Patrz: http://stackoverflow.com/questions/4697705/php-function-overloading – Arvind

Odpowiedz

10

Należy uczynić różnicę między method overriding (Twój przykład) i method overloading

Oto prosty przykład jak zaimplementować metodę przeciążenia w PHP przy użyciu __call magiczną metodę:

class test{ 
    public function __call($name, $arguments) 
    { 
     if ($name === 'test'){ 
      if(count($arguments) === 1){ 
       return $this->test1($arguments[0]); 
      } 
      if(count($arguments) === 2){ 
       return $this->test2($arguments[0], $arguments[1]); 
      } 
     } 
    } 

    private function test1($data1) 
    { 
     echo $data1; 
    } 

    private function test2($data1,$data2) 
    { 
     echo $data1.' '.$data2; 
    } 
} 

$test = new test(); 
$test->test('one argument'); //echoes "one argument" 
$test->test('two','arguments'); //echoes "two arguments" 
+0

Jak zrobić jeden z nich chronione i inne publiczne? Wydaje się, że jeśli __call musi być publiczny, ten rodzaj otwiera szeroko bramy? Przypadek użycia, getter publiczny, chroniony program ustawiający o tej samej nazwie, co właściwość data ... lub może być konieczne przeanalizowanie informacji o abonencie wywołującym (może być nieco bardziej szczegółowy). – nus

+0

Czy mogę mieć tutaj wiele funkcji połączeń? – Shan

+0

Proszę opracować, co masz na myśli przez * wiele funkcji połączeń *. Jeśli wykracza to poza zakres tego pytania, opublikuj to jako nowe pytanie. Jestem pewien, że dostaniesz dokładną odpowiedź. – skafandri

1

więc moje pytanie jest przeciążanie metody wsparcia php (?).

Tak, ale nie w ten sposób, aw swoim przykładzie, nie sugeruje, że ten rodzaj przeciążenia jest poprawny, przynajmniej w wersji 5.5.3 z niego i error_reporting(E_ALL).

W tej wersji, podczas próby uruchomienia tego kodu, to daje następujące komunikaty:

Strict Standards: Declaration of test1::test() should be compatible 
with test::test($data1) in /opt/lampp/htdocs/teste/index.php on line 16 

Warning: Missing argument 1 for test::test(), called in /opt/lampp/htdocs/teste/index.php 
on line 18 and defined in /opt/lampp/htdocs/teste/index.php on line 4 

Notice: Undefined variable: data1 in /opt/lampp/htdocs/teste/index.php on line 6 
hello world //it works, but the messages above suggests that it's wrong. 
0

Zapomniałeś dodać „funkcja” przed badaniem w obu przypadkach. Wywoływana jest metoda klasy potomnej, ponieważ gdy wywołuje się metodę z obiektu klasy potomnej, najpierw sprawdza się, czy ta metoda istnieje w klasie potomnej, a jeśli nie, to przeszukuje dziedziczoną klasę nadrzędną z widocznością jawną lub chronioną kontrolą i jeśli istnieje metoda, niż zwraca wynik zgodnie z tym.

Powiązane problemy