Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Web Development
You last visited: Today at 15:48

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



PHP OOP static Problem

Discussion on PHP OOP static Problem within the Web Development forum part of the Coders Den category.

Reply
 
Old   #1
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
PHP OOP static Problem

Hi,

hab ein Problem bei PHP im Objektorienterten Bereich.

index.php
PHP Code:
require_once('cms.class.php');

$cms = new cms(); 
cms.class.php
PHP Code:
class cms {

    private 
$time;

    private static 
$page;
    private static 
$user;
    private static 
$db;
    
    public function 
__construct() {
    
        
$this->setDB();
        
$this->setPage();
        
$this->setUser();
        
        
$this->time time();
        
$this->validateForms();
        
    }
    
    
/*
     * Information about Page
     */
    
    
private function setPage() {
        
self::$page = new page();
    }
    
    public static function 
getPage() {
        return 
self::$page;
    }
    
    
/*
     * Information about User
     */
    
    
private function setUser() {
        
self::$user = new user();
    }
    
    public static function 
getUser() {
        return 
self::$user;
    }
    
    
/*
     * Information about Database
     */
    
    
private function setDB() {
        
self::$db = new db();
    }
    
    public static function 
getDB() {
        return 
self::$db;
    }

page.class.php
PHP Code:
class page  {
    
    private 
$templateDir "templates/";
    
    private 
$pageDir "pages/";
    private 
$pageName;

    public function 
__construct() {
        
$this->setPage();
        
$this->setTemplate();
                echo 
cms::getUser()->getUsers();
    }

Das Problem nun dabei ist, dass ich in der page.class.php nicht auf die statische Funktion getUser() zugreifen kann:
Code:
Fatal error: Call to a member function getUsers() on a non-object in C:\xampp\htdocs\lib\page\page.class.php on line 16
Ich erkenne leider den Fehler nicht. Kann mir da jemand vll weiterhelfen?
Mikesch01 is offline  
Old 02/01/2013, 15:20   #2
 
KoKsPfLaNzE's Avatar
 
elite*gold: 0
Join Date: Jan 2009
Posts: 731
Received Thanks: 233
Wenn du Static functions aufrufst wird die klasse nicht instanziert, sprich __construct wird nicht durch laufen, somit wird auch kein User gesetzt. Why machst es net ohne static? Rufst das teil doch sowieso mehr mals auf.
KoKsPfLaNzE is offline  
Old 02/01/2013, 15:27   #3
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Ah iam sorry hab ne Information vorenthalten.

Natürlich wird cms einmal instanziiert. Wie soll es denn ohne static funktionieren? Hab natürlich mehrere Klassen.
Mikesch01 is offline  
Old 02/01/2013, 15:31   #4

 
Synatex's Avatar
 
elite*gold: 25
Join Date: Apr 2010
Posts: 1,019
Received Thanks: 331
Warum solltest du es mit statischen lösen?

Diese hebeln eigentlich genau den OOP Effekt aus wenn man sie für ein Objekt nutzt was mehrmals gebraucht wird.. Stichwort Singelton und statische Objekte.

Du erstellst dein CMS, übergibst dann entweder das Objekt an die Page-Klasse oder extendest die Page-Klasse mit den Funktionen von dem CMS, damit sie zusammenarbeiten.

Für sowas nutzt man aber keine statischen Methoden.
Synatex is offline  
Old 02/01/2013, 15:38   #5
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Hm, aber wie löse ich das mit der Datenbank bitte, wenn ich kein statisches Objekt habe? Ich instanziiere das Objekt ja in cms.class.php, aber möchte es in mehreren anderen Klassen verwenden, die in cms.class.php auch defniert sind wie z.B. user.class.php?

Kann mir da jemand ein Biespiel geben?
Mikesch01 is offline  
Old 02/01/2013, 16:04   #6

 
Synatex's Avatar
 
elite*gold: 25
Join Date: Apr 2010
Posts: 1,019
Received Thanks: 331
Erben. Hauptobjekt ist die CMS Klasse. Diese kriegt dann das Datenbankobjekt übertragen, oder erbt es ebenfalls. Dann hast eine Klasse die als User-System-Wrapper dient die dann bestimmte Funktionen des "CMS" erbt und für die User-Klasse dann darstellt oder übergibt.

Somit wäre es beispielsweise:

PHP Code:
<?php

class Cms extends Db { } ...
class 
UserWrapper extends cms // Ziehe Funktionen zur bereitstellung } ...
class User extends UserWrapper { } ...

?>
Dann kommt es halt drauf an wie du mit private/public/protected spielst um zu sehen welche Methoden zur Verfügung stehen.
Synatex is offline  
Old 02/01/2013, 16:23   #7
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Das ist doch aber semantisch nicht richtig oder?

So müsste jeder Klasse von cms abgeleitet werden und cms hat ja keine gemeinsamen Eigenschaften mit der jeweiligen Klasse.

Bin grad bisschen verwirrt...
Mikesch01 is offline  
Old 02/01/2013, 16:43   #8

 
Synatex's Avatar
 
elite*gold: 25
Join Date: Apr 2010
Posts: 1,019
Received Thanks: 331
Dann machst dir halt einen Einsprungspunkt von der Klasse Main(). Es muss etwas geben von wo du auf alle nötigen Hilfsmittel zugreifen kannst, sonst kannst direkt das ganze mit Funktionen lösen und das dort includen wo du es brauchst..

Die Klasse CMS wird dann weiter unteilt in CMSUsers, CMSArticles, CMS... und so weiter, dass "CMS" nur als Grundgerüst dient.
Synatex is offline  
Old 02/01/2013, 19:26   #9
 
elite*gold: 0
Join Date: Jan 2012
Posts: 759
Received Thanks: 416
Hi,

ich verstehe auch nicht, wieso nach Syntax ein guter Ansatz sein soll, wenn ein Benutzer im Endeffekt von der Datenbank-Klasse ableitet. So eine Vererbungshierarchie ist imho total schwachsinnig.

Eine "hat-ein"-Beziehung zwischen User und DB ist definitiv sinnvoller als eine "ist-ein"-Beziehung - denn der Benutzer ist keine Datenbank ... (Oder irgendwie so argumentiert). Zudem würde Syntax's Lösungsansatz das Problem, dass alle Objekte das gleiche DB-Objekt nutzen sollen, nicht (... denn mit seinem Ansatz ist fast jedes Objekt ein eigenes DB-Objekt).

1. DB als Singleton: Du kannst auf das DB-Objekt von überall zugreifen. Nachteil: Viele Klassen sind fest an das Datenbank-Objekt gebunden. Es ist nicht mögliche, einzelne Komponente ohne eine richtige Datenbank zu testen.

2. DI: Du übergibst das DB-Objekt an jedes Objekt (via Setter oder direkt dem Konstruktor). Wenn du für die DB-Klasse eine Schnitstelle definierst kannst du sie so austauschen.
Dazu kannst du noch einen DI Container nutzen: Das ist ein Framework, das für dich Objekte anlegt und dabei die Abhängigkeiten dieser prüft und auflöst. Ich weiß nicht, welche Frameworks es dafür in PHP gibt, aber in Java mit Guice könnte das beispielsweise so aussehen (Methodennamen können falsch sein, ich habe die nicht im Kopf):

Quote:
class MyService implements MyServiceInterface {}
class MyComponent {
@Inject private MyServiceInterface theService;
}

Injector guice = new Injector();
guice.bind(MyService.class).to(MyServiceInterface. class);

MyComponent c = guice.newInstance(MyComponent.class);
Guice erkennt die @Inject-Annotation automatisch und löst die Abhängigkeit auf; mit zusätzlichen Annotation kann bestimmt werden, dass von einem Service immer das gleiche Objekt genutzt werden soll.

Viele DI Container lagern die Informationen über die Abhängigkeiten auch in Konfigurationsdateien aus (z.B. Spring).

3. Service Locator Pattern: Jede Klasse kennt irgendwie einen Service Locator, der Abhängigkeiten auflösen kann. Quasi eine API wie

Quote:
DatabaseInterface db = locator.get(DatabaseInterface.class);
Der konkrete Komponent muss so nicht wissen, woher dieses Objekt stammt. Das PHP Framework "APF" löst das auch in etwa so - dort verfügt jeder Service (und Controller etc.) über eine Methode "getServiceObject(name:Str)", die eine Instanz des Services liefert.

Am besten zu schaust dir an, wie richtige Frameworks das lösen (Yii, Symfony etc.).
dowhile is offline  
Reply


Similar Threads Similar Threads
Problem With Static Ip
06/07/2012 - SRO Private Server - 4 Replies
Guys i Have Static ip and trying to make my server public i use static ip in my internet connection cert ,, all working well all ports opened :S working in my pc but when i try login from other pc in my network ! server offline !
Problem Running 5165 Server on Static ip
02/10/2011 - CO2 Private Server - 14 Replies
I have Static ip but i have a problem When i set my static ip in config.ini ppl can join the server but i can't When i put my computer ip like 192.168.1.2 in config.ini i can join but ppl can't how to fix this? I had Same problem with binary but at binary i used to use 2 account servers... first one with my computer ip 192.168.1.2 that let me login the other one with the static ip that let ppl login
Shaiya PServer static ip problem i need help
10/08/2010 - Shaiya Private Server - 3 Replies
How can we Run our server with static ip...We want run our server and we want players join server w/o hamachi
sorc problem (static) beim d2nt
07/04/2010 - Diablo 2 - 2 Replies
yo hab in der suchfunktion nichts gefunden, habe folgenden fehler mit meiner sorc: blablapfad:scripts/libs/common/NTAttack.ntl (604) : ReferenceError: NTConfig_CastStatic is not defined hier ma der abschnitt in der besagten datei: return 3; }
Problem with public static byte Authenticate
06/10/2010 - CO2 Private Server - 1 Replies
database.cs line 1498 public static byte Authenticate(string UserName, string Password) { try { MySqlDataAdapter DataAdapter = new MySqlDataAdapter("SELECT * FROM `Accounts` WHERE `AccountID` = '" + UserName + "'", Connection); DataSet DSet = new DataSet(); DataAdapter.Fill(DSet, "Account");



All times are GMT +1. The time now is 15:49.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.