XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   PHP / OOP Vererbung, Konstructor, error!! (http://xhtmlforum.de/showthread.php?t=74114)

Iago2 07.07.2020 10:32

PHP / OOP Vererbung, Konstructor, error!!
 
Hi folks,

Ich hab hier eine UserList-Klasse, die von User erbt. Ich übergebe ein Datenbank-Objekt an den Konstruktor, kann das Objekt in UserList aber nicht aufrufen und prepare andwenden: (ERROR: Call to a member function prepare() on null in)

Wo liegt der Fehler? Thank you very very much!!

PHP-Code:

class User  {

    private 
$userId;
    private 
$userName;
    private 
$language;
    private 
$db;
    private 
$date;
    

  public function 
__construct($db) {

    
$this->db $db;
    
$this->userId $_SESSION['id'];
    

 }

... 
uswusf...

}

class 
UserList extends User {


    public function 
__construct($db) {

    
parent::__construct($db);


 }

 public function 
fetchUsersData() {
        
//returns username + language ---> actions.php for AJAX request
        //the current user is NOT included int the query

        
$stmt $this->db->prepare("SELECT `id`,`username`,`lang` 
                                    FROM user
                                    WHERE id != ?"
);

         
$stmt->execute([$this->userId]);
       while(
$row $stmt->fetch(PDO::FETCH_ASSOC)) {

            
$usersList[] = $row;
       }

       return 
$usersList;
 }


PHP-Code:

$db = new Database();

$userList = new UserList($db);
                  
print_r($userList->fetchUsersData()); 


Iago2 08.07.2020 09:58

Ja. mit protected läufts besser: :)

Code:

class User  {

        protected $userId;
        protected $userName;
        protected $language;
        protected $db;
        protected $date;
        protected $png100Path;

.....


protonenbeschleuniger 08.07.2020 11:28

Nur ein Denkanstoss.

Wieso ist eine Liste ein User? Sollte eine UserListe nicht (ein Array) User haben (has)?

Auch das der User eine Datenbank hat ist vom OO Aspekt fragwürdig. Das Objekt User braucht keine Datenbank.

(Und ich schreibe das, weil ich selbst genau diese Fehler in meinen alten Programmen zu Hauf finde)

Iago2 09.07.2020 08:31

Zitat:

Zitat von protonenbeschleuniger (Beitrag 554304)
Nur ein Denkanstoss.

Wieso ist eine Liste ein User? Sollte eine UserListe nicht (ein Array) User haben (has)?

Auch das der User eine Datenbank hat ist vom OO Aspekt fragwürdig. Das Objekt User braucht keine Datenbank.

(Und ich schreibe das, weil ich selbst genau diese Fehler in meinen alten Programmen zu Hauf finde)

Ja, ich versteh schon. D.H. ich implementiere User allgemeiner (ähnlich einer abstrakten Klasse) und verwende dann User (als Array z.B.) in anderen Klassen, die dann verschiedene Dinge tun: erstelle eine UserList und formatieren sie soundso, richtig !?

protonenbeschleuniger 09.07.2020 08:47

Wie gesagt ich habe selbst Code voll mit diesen Fehlern. Daher bin ich leider der falsche der dir wirklich einen Rat geben könnte.

Nach meinem Verständniss, müsste grob der User ein Datenbankmodell sein und die Aktionen (Verarbeitung) mit diesem erfolgen nur in einem Controllerobjekt. Die Liste ist ein Array von Objekten oder eine Ableitung davon. Die Darstellung übernehmen dann andere Objekte i.d.R. Views.

Aber wie gesagt ich schreibe darüber, merke aber in der Praxis die Umsetzung fällt mir seit Jahren ebenfalls schwer und ergibt sich dann oft erst im Kontext der tatsächlichen Anwendung wenn ich merke, wo meine Objekte zu Abhängig sind und ich mich wieder in eine Einbahnstrasse programmiert habe.
(Aber das ist vielleicht auch ein Teil des Spaßes des Hobbyprogrammierers ;) )

Iago2 09.07.2020 10:41

Zitat:

Nach meinem Verständniss, müsste grob der User ein Datenbankmodell sein und die Aktionen (Verarbeitung) mit diesem erfolgen nur in einem Controllerobjekt. Die Liste ist ein Array von Objekten oder eine Ableitung davon. Die Darstellung übernehmen dann andere Objekte i.d.R. Views.
Ich hatte mal eine Java-Implementierung, ein Kartenspiel, da habe ich eben dieses Kartenspiel mit Kartenobjekten erzeugt.
(->Buch rausholen :D)

Genau, da habe ich die Daten im Kunstruktor des Erzeugerobjekts DeckOfCards (faces[]={"Ace","Deuce"...}, suits[]={"Hearts","Diamonds"...}, mit eine Schleife an die Kartenobjekte übergeben. new Card(faces[],suits[]);

D.H hier hab ich die Daten im Array des Konstruktors (DeckOfCards), aber genauso kann ich natürlich auch die von der Datenbank holen.

Aber natürlich benötige ich zunächst Userdaten um auf die DB zugreifen zu können, das ist komplexer als diese Java Beispiel.


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:35 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2021, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2020