Ankündigung

Einklappen
Keine Ankündigung bisher.

Konstruktor weißt Eigenschaft keinen Wert zu

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • NecmiH
    hat ein Thema erstellt Konstruktor weißt Eigenschaft keinen Wert zu.

    Konstruktor weißt Eigenschaft keinen Wert zu

    Guten Tag!
    Ich habe gerade noch ein kleines Problem. Ich möchte auf die Connection zugreifen die in der Index.php liegt bzw. auf die Variable $connection, damit ich sie in einer Model zugreifen kann & benutzen kann.

    Irgendwie weißt der Konstruktor den Eigenschaften keinen Wert zu, hier mein Code:
    PHP-Code:
    class Model {
        
        private 
    $_connection;
        private 
    $_controller;
        
        public function 
    __construct($controller$connection) {
            
    $this->_connection $connection;
            
    $this->_controller $controller;
        }
        
        public function 
    getController() {
            return 
    $this->_controller;
        }
        
        public function 
    getConnection() {
            return 
    $this->_connection;
        }

    Und mache folgendes:
    PHP-Code:
    require 'config.php';
    require 
    'sc/lib/Bootstrap.php';
    require 
    'sc/lib/Controller.php';
    require 
    'sc/lib/View.php';
    require 
    'sc/lib/Model.php';

    $connection = new MySQLi("localhost""root""***""**") or die($connection->error);
    $connection->set_charset('utf-8');
    $controller = new Controller($connection);
    new 
    Model($controller$connection); 
    Wenn ich ein Var_DUMP in einem der Models mache erhalte ich für die Methode getConnection() = NULL, wieso? Oo

    MfG.

  • BlackScorp
    antwortet
    PHP-Code:
    abstract class Model {
        
        private 
    $_connection;
        private 
    $_controller;
        
        public function 
    __construct(Controller $controllermysqli $connection) {
            
    $this->_connection $connection;
            
    $this->_controller $controller;
        }
        
        public function 
    getController() {
            return 
    $this->_controller;
        }
        
        public function 
    getConnection() {
            return 
    $this->_connection;
        }
    }  

    class 
    TestModel extends Model{

    public function 
    test(){
    $result $this->getConnection()->query('SELECT * FROM users');
    }


    PHP-Code:
    require 'config.php';
    require 
    'sc/lib/Bootstrap.php';
    require 
    'sc/lib/Controller.php';
    require 
    'sc/lib/View.php';
    require 
    'sc/lib/Model.php';

    $connection = new MySQLi("localhost""root""***""**") or die($connection->error);
    $connection->set_charset('utf-8');
    $controller = new Controller($connection);
    $model = new TestModel($controller$connection);  
    $model->test(); 

    Einen Kommentar schreiben:


  • NecmiH
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Die bessere Variante hat jspit allerdings angegeben!

    Sofern die Methode query() im entsprechenden Objekt existiert, ja.
    Komisch. Im Konstruktor wird allerdings die Connection gesetzt => new Model($database->DatabaseConnect());
    Und eig. im getConnection() nur die Connection (Eigenschaft _connection) zurück gegeben.

    Wieso wird query() als Methode von Model angesehen?
    PHP-Code:
    class testModel extends Model {
        
        public function 
    __construct($connection) {
            
    parent::__construct($connection);
        }
        
        public function 
    test() {
            
    $test $this->getConnection()->query("SELECT * FROM users");
            
    //echo $test->num_rows;
            //var_dump($this->getConnection());
        
    }

    Die Variante von JSPIT ist bei mir total überflüssig. Da ich die Models in die Controllers laden muss, und ich nicht extra für den Controller eine Connection aufbauen möchte. Dafür habe ich die Models da.

    Aber danke für eure Hilfe!
    MfG.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Cool, hat mir echt weiter geholfen!
    Die bessere Variante hat jspit allerdings angegeben!

    Obwohl getConnection() nur einen return von der Eigenschaft _connection macht. Sollte doch eig. funktionieren. Oo
    Sofern die Methode query() im entsprechenden Objekt existiert, ja.

    Einen Kommentar schreiben:


  • NecmiH
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Adhoc würden mir drei Möglichkeiten einfallen:
    1. In testModel ein Objekt vom parent (Model) erzeugen
    Cool, hat mir echt weiter geholfen! Wenn ich nun var_dump() auf getConnection() in der testModel Klasse mache, bekomme ich die Werte.

    Anderes Problem, wenn ich $this->getConnection()->query("SELECT xxx"); mache, bekomme ich halt folgenden Error:

    Fatal error: Call to undefined method Model::query() in /Applications/XAMPP/xamppfiles/htdocs/sc/models/testModel.php on line 22
    Obwohl getConnection() nur einen return von der Eigenschaft _connection macht. Sollte doch eig. funktionieren. Oo

    MfG.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Das stimmt allerdings, dafür kriegst Du ein Bienchen...

    Einen Kommentar schreiben:


  • jspit
    antwortet
    <klugschei.. on>
    Mit 4. existiert nur eine Instanz von testModel und auch intern kein "Objekt vom parent (Model) "
    <klugschei.. off>

    Erzeugt er im testModel ein Objekt vom parent (Model), hat er Zugriff auf die Methoden von Model und
    'extends Model' ist dann mehr als überflüssig. So sehe ich das jedenfalls.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Joa... hast schon recht, aber das Szenario sähe ich in 1. implementiert...
    Aber gut, kann man erwähnen...

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Ich sehe da noch
    4. $extObj = new testModel($database->DatabaseConnect());

    Wenn die Klassenerweiterung keinen eigenen Konstruktor hat, übernimmt das der Konstruktor der geerbten Klasse.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Adhoc würden mir drei Möglichkeiten einfallen:

    1. In testModel ein Objekt vom parent (Model) erzeugen

    2. testModel eine Instanz von Model übergeben

    3. Model statisch machen

    Alle haben Vor- und Nachteile. Aber wenn Du die Instanz benötigst, wirst Du Dich für eine der drei entscheiden müssen...

    Einen Kommentar schreiben:


  • NecmiH
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Ja, hab ich übersehen -> siehe Edit in meinem Post über Dir!
    Gibt es andere Wege, womit ich eine Connection aufbauen kann, und die dann auch verwenden kann (in den Model-Klassen bspw. testModel)?

    MfG.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Ja, hab ich übersehen -> siehe Edit in meinem Post über Dir!

    Einen Kommentar schreiben:


  • NecmiH
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    Und var_dump($model->getConnection()); sagt null?
    Dann kann Dein $database->DatabaseConnect() nur null zurückgeben!

    Mir ist aber so, als wäre das schon erwähnt worden.
    Ich hatte schon in meinen vorherigen Post gesagt, das er nur in der testModel Klasse NULL zurück gibt.

    Sonst wenn ich auf $model->getConnection(); einen var_dump() ausführe bekomme ich die Werte die ich sehen will.

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Und var_dump($model->getConnection()); sagt null?
    Dann kann Dein $database->DatabaseConnect() nur null zurückgeben!

    Mir ist aber so, als wäre das schon erwähnt worden.


    EDIT: Ach so... Du meinst bspw. in Deiner testModel_Klasse?
    PHP-Code:
    class testModel extends Model 
        public function 
    test() { 
            
    //$test = $this->getConnection()->query("SELECT * FROM users"); 
            //echo $test->num_rows; 
            
    var_dump($this->getConnection()); 
        } 

    Du hast ja in dieser Klasse noch gar kein Objekt von Model, Du erbst lediglich die Methoden und Eigenschaften von Model, nicht aber die Instanz(en).

    Einen Kommentar schreiben:


  • NecmiH
    antwortet
    Zitat von Arne Drews Beitrag anzeigen
    In wie weit hast Du den Konstruktor von der Klasse Model denn verändert?
    Der erwartet nämlich lt. Deiner bisherigen Veröffentlichungen zwei Parameter, Du übergibst aber nur einen!
    Hier meine Model.php
    PHP-Code:
    class Model {

        public 
    $_connection;
        public function 
    __construct($connection null) {
            
    $this->_connection $connection;
        }
        
        public function 
    getController() {
            return new 
    Controller();
        }
        
        public function 
    getConnection() {
            return 
    $this->_connection;
        }

    Einen Kommentar schreiben:

Lädt...
X