2016-07-16 3 views
2

Ich habe grundlegende Fähigkeiten der OOP-Programmierung und ich versuche, eine sehr einfache MVC-Framework zu erstellen. Seltsamerweise ruft die Indexmethode sich selbst auf, wenn ich die App instanziiere und den Grund nicht herausfinden kann.Methode nennt sich selbst, wenn ich die Klasse instanziieren

Meine Indexdatei habe dies: $ app = new App();

Mein Bootstrap sieht wie folgt aus:

class App { 

    private $_controller = null; 

    public function __construct() { 
     $default_controller = 'controller/index.php'; 
     require $default_controller; 
     $this->_controller = new Index(); 
    } 
} 

Hier ist meine Haupt-Controller-Klasse:

class Controller { 

    public function loadModel($name) { 
     require('models/'. strtolower($name) .'.php'); 

     $model = new $name; 
     return $model; 
    } 

    public function loadView($name) { 
     $view = new View($name); 
     return $view; 
    } 
} 

Meine Hauptmodellklasse:

class Model { 

    public function __construct() { 
     $this->db = new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT); 
    } 

} 

Und hier ist meine Index-Klasse:

class Index extends Controller { 

    public function index() { 
     $example = $this->loadModel('Index_Model'); 
     $something = $example->content('test'); 

     $view = $this->loadView('index'); 
     $view->set('content', $something); 
     $view->render(); 
    } 

} 
+0

In PHP 4 diente eine Methode mit dem gleichen Namen wie die Klasse als Konstruktor - und es wird immer noch als Kompatibilitäts-Fallback verwendet. (Groß-/Kleinschreibung in bestimmten Aspekten steht hier oben.) – CBroe

+0

also, wenn die Klasse und ihre Methode denselben Namen haben, wird die Methode aufgerufen, wenn ich die Klasse instanziiere? – Dejavu

Antwort

5
class Index extends Controller { 

    public function index() { 

In PHP 4 diente eine Methode mit dem gleichen Namen wie die Klasse als Konstruktor - und wird immer noch als Kompatibilitäts-Fallback verwendet.

http://php.net/manual/en/language.oop5.decon.php:

„Für die Rückwärtskompatibilität mit PHP 3 und 4, wenn PHP nicht __construct() Funktion für eine bestimmte Klasse finden, und die Klasse hat erbt nicht ein von einer übergeordneten Klasse, wird es Suche nach der alten Konstruktorfunktion nach dem Namen der Klasse. "

(Case-Unempfindlichkeit von PHP in bestimmten Aspekten kommt auf hier.)

[von Kommentaren] so meinen Sie, wenn die Klasse und ihre Methode denselben Namen haben wird das Verfahren, wenn sie aufgerufen werden, Ich instanziiere die Klasse?

Ja.

Sie müssen entweder die Methode umbenennen oder einen Konstruktor über eine Methode mit dem Namen __construct entweder in der Klasse selbst oder in der Klasse selbst bereitstellen.


Edit:
Wie Sie tauchen in MVC sind, wie Sie gesagt haben, Sie könnten in Namensräumen zu suchen. Wie die Handbuchseite, mit der ich weiter verlinkte, lautet: "Ab PHP 5.3.3 werden Methoden mit dem gleichen Namen wie das letzte Element eines Namespace-Klassennamens nicht mehr als Konstruktor behandelt." - so würde das Problem auch beseitigen.

+2

Ich bin froh zu sagen, ich glaube nicht, dass ich das je gewusst hätte ... – Jonathan

+0

Aber ich habe PHP Version 5.6.10 auf meinem lokalen Server ausgeführt? – Dejavu

+0

Ja, das ist der Punkt. Es ist ein Abwärtskompatibilitäts- "Feature" – Jonathan