php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.08.2007, 13:36  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard Vererbung - Include?

Habe gleich nachdem ich den letzten Beitrag geschrieben habe, wie immer etwas passendes gefunden.

Zitat:
Zitat von KingCrunch
Ich kanns dir erklären (juchei!!!)
Parent-Klasse definiert eine statische Methode und alle Childs können sie per parent::methode() abrufen.
PHP-Code:
class Parent {
  public static function 
methode ($a) {
    
// do something useful with $a
  
}
}

class 
Child extends Parent {
  public function 
doSomething ($a) {
    
parent::methode($a)
    
// and so on
  
}

Nun meine Frage:
Muss ich das File, in welchem sich die Parent-Klasse befindet per include einfügen, obwohl die Funktion in der Parent-Klasse static ist und die Child-Klasse von der Parent-Klasse erbt? Das sollte doch anders gehen, nicht?
Igäl ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.08.2007, 13:42  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Muss ich das File, in welchem sich die Parent-Klasse befindet per include einfügen
Ja, PHP muss die Klasse "Parent" kennen, wenn sie per extends als Eltern-Klasse für eine andere dient.
Übrigens ist der Klassen-Name "Parent" hier sehr unglücklich gewählt, denn "parent" ist genauso wie "self" oder $this ein reservierter Bezeichner in der OOP von PHP.
Zergling-new ist offline  
Alt 16.08.2007, 13:49  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Äh .... Woa ^^ Kumpel nannte das mal "extreme namedropping" Oo Also übermässiger Gebrauch von Fach-Fremdwörtern Lass ma sortieren:
Zitat:
Muss ich das File, in welchem sich die Parent-Klasse befindet per include einfügen, [..]
Jo, sofern noch nicht geschehen und sofern sie sich in seperaten Dateien befinden. require_once bietet sich an. Er bricht ab, wenn er sie nicht findet und du läufst auch nicht Gefahr die Datei zwei mal zu Laden, was bei reinen Klassendateien sowieso überflüssig und falsch ist.
PHP-Code:
<?php
require_once 'My/Parent/Class.php';

class 
My_Child_Class extends My_Parent_Class
{
  
// Blafasel
}
?>
Zitat:
[..]obwohl die Funktion in der Parent-Klasse static ist [..]
Das macht keinen Unterschied. Trotzdem muss ja dein Kind wissen, was Papa so alles zu bieten hat
Zitat:
[..] und die Child-Klasse von der Parent-Klasse erbt?
Was ändert das? Um zu erben muss die Klasse bekannt sein. Denkbar, wenn auch unüblich und nicht empfehlenswert wäre ja auch eine Variante zwei gleichnamige (potentielle) Parent-Klassen bereit zu stellen und je nach Funktionalität die eine oder die andere zu laden. Zudem kann PHP selbst nicht wissen, wo eigentlich die ganzen Klassen rumfliegen.
Zitat:
Das sollte doch anders gehen, nicht?
Jo Wie immer Magic Method: __autoload bzw spl_autoload. Funktioniert nach extends bzw implements ebenso, nicht nur nach new. Löst zwar nich das "Problem", dass die Dateien zunächst geladen werden müssen, automatesiert es allerdings. Würde allerdings eher überall, wo möglich, eher in die eine (zwei, falls Interface noch vorhanden) extra Zeile investieren.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 16.08.2007, 13:50  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Nun hat sich zumindest die Fehlermeldung geändert:

Code:
Fatal error: Call to undefined method Admin::get_user_data() in C:\Programme\xampp\htdocs\zwiigstell\modules\admin\Admin.class.php on line 51
Teile meines Scriptes sehen so aus:
PHP-Code:
include("AdminCommonFunct.class.php");

class 
AdminUsers extends AdminCommonFunct    {
    public function 
get_data()    {
    [...]
    
$user_data parent::get_user_data();
    [...]

Eigentlich müsste man mit parent:: doch die AdminCommonFunct.class.php ansprechen oder? Stattdessen spricht er die Klasse Admin an, welche AdminUsers aufruft. Wie greife ich auf die verebende Klasse zu, wenn nicht über parent: Wenn ich über den KlassenNamen:: zugriffe, bräuchte ich ja nicht zu vererben.
Igäl ist offline  
Alt 16.08.2007, 13:52  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Ich sehe keine Klasse Admin Oo Wo kommt die her?

Ich seh auch nur, dass der Fehler in der Klasse Admin auftaucht und nicht in AdminUsers. Oder befindet sich die AdminUsers-Klasse in der Datei Admin.class.php? Wenn ja, wärs bissel inkonsequent, aber ok Wenn nicht, suchst du einfach an der falschen Stelle ^^
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 16.08.2007, 13:57  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Aus meiner Struktur. Wird vom index.php instanziert:

PHP-Code:
class Admin    {
    function 
show_admin($smarty)    {
        switch(
$_GET['smid'])    {

            case 
1:        $a_users = new AdminUsers;
                        
$a_users_data $a_users->get_data();
[...]

Igäl ist offline  
Alt 16.08.2007, 14:05  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Wie gesagt stehe ich vollständig aufm Schlauch. Ich versuche mir und euch einen kurzen Überblick zu verschaffen:

- Bei Klick auf einen Link werden die URL-Parameter mid (modul id) und smid (submodul id) mitgegeben.
- Im index.php hat es einen switch. Wenn der mid-Parameter beispielsweise 10 ist, wird die Klasse Admin instanziert und eine Funktion show_admin aufgerufen
- Die Funktion show_admin prüft in einem switch die smid. Wenn die smid 1 ist, wird die Klasse AdminUsers instanziert
- AdminUsers liest die Userdaten aus und speist sie in ein Array ein, dass dann an Admin zur Ausgabe (über smarty) zurückgegeben wird
- AdminUsers braucht aber Funktionen gemeinsam mit der Klasse AdminAccess (welches aufgerufen wird, wenn smid 2 ist) und darum will ich, dass AdminUsers von AdminCommonFunct (wo die gemeinsamen Funktionen drin sind) erbt

So jetzt ists mir etwas klarer. Ich hoffe euch auch

Das Problem:
- Obwohl AdminUsers von AdminCommonFunct erbt, sucht das Script parent::gewuenschte_funktion() in der Klasse Admin


Edit:
print_r(class_parents(AdminUsers));
ergibt
Array ( [AdminCommonFunct] => AdminCommonFunct )

So langsam beginn ich gar nix mehr zu verstehen...
Igäl ist offline  
Alt 16.08.2007, 14:20  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Naja, aber anscheinend tritt der Fehler trotzdem (anscheinend) in der Klasse Admin auf. Da diese nicht von AdminCommonFunct erbt, kann sie natürlich auch nicht über parent auf eben diese Methode zugreifen. Jetz zeich doch einfach ma, was so in Admin.class.php Zeile 51 drin steht
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 16.08.2007, 14:27  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

So.. diesen Thread könnt ihr löschen. Das war ja wohl seit langem die total dämlichste Aktion. Man könnte meinen ich hätte in der 1. Klasse lesen gelernt. Aber scheinbar funktioniert das heut noch nicht. Naja wird mal Zeit, dass ich heute ein wenig Pause mache.

Danke KingCrunch. Ich hab nur die vertrackte Fehlermeldung net richtig gelesen -.- So zeugs nervt. Könnt den Thread von mir aus auch löschen, oder als Exempel aufs Schaffoth schicken...

*kopf@tisch*
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
Mark Twain
Igäl ist offline  
Alt 16.08.2007, 14:32  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Nicht nur die Meldung, sondern auch mein Posting von 13.52
Zitat:
Ich seh auch nur, dass der Fehler in der Klasse Admin auftaucht und nicht in AdminUsers. Oder befindet sich die AdminUsers-Klasse in der Datei Admin.class.php? Wenn ja, wärs bissel inkonsequent, aber ok Very Happy Wenn nicht, suchst du einfach an der falschen Stelle ^^
Auf den Fahrten der damaligen Jugendfeuerwehr gabs immer ein total pottenhässliches, eklig rosa-farbenes (zumindest war es das ma) T-Shirt für Leute, die den Vogel abgeschossen haben War so ne Art Wanderpokal, bloss war man nicht stolz drauf

Nagut, Problem gelöst, dann ist ja alles gut Hat aber meinen Tag trotzdem erheitert
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
include() ersetzen Shadow21 PHP Tipps 2006 3 30.08.2008 14:13
[Erledigt] Problem mit Include pck1983 PHP Tipps 2008 7 15.07.2008 19:13
include isoliert ausführen – Lösungsansatz gesucht veit PHP-Fortgeschrittene 8 09.04.2008 09:26
hinter include wird eine 1 angezeigt |~Râdîant~| PHP Tipps 2008 8 19.09.2007 13:52
include Dateien wieder ausängen o.Ä. netti PHP Tipps 2007 8 17.12.2006 15:14
include problem Canni PHP Tipps 2006 26 14.11.2006 14:24
include, nur bestimmten teil neu laden Calli PHP Tipps 2006 2 27.01.2006 15:57
include aus frame heraus auf anderen Frame Calli PHP Tipps 2005-2 2 08.09.2005 15:23
Auf Firmen-Server funzt kein include aus fremden Verzeichnis PHP-Fortgeschrittene 3 19.07.2005 16:49
[Erledigt] Include liegt in einem anderen Verzeichnis - es geht nix PHP Tipps 2005-2 3 03.07.2005 22:40
include innerhalb einer seite rückgängig machen PHP Tipps 2005 2 27.03.2005 20:26
[Erledigt] Sessions auch bei include aktiv? PHP Tipps 2005 1 28.02.2005 19:58
[Erledigt] was gibt es sonst noch, anstad include? PHP Tipps 2005 2 05.01.2005 22:31
[Erledigt] Problemme mit include... PHP Tipps 2004-2 6 30.11.2004 12:20
HTTP_GET_VARS + Include = Array leer PHP Tipps 2004-2 3 24.11.2004 15:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
definition access vererbung parent and child, php erkennt klasse nicht trotz include, php vererben include, php in include datei eine klasse vererben, php magic methods vererben, php vererbung include, php vereerbung include, include vererben, include php vererbung, php aus klasse include, vererben include, php klasse unterschied includes extends, http://www.php.de/php-tipps-2008/44600-vererbung-include.html, klasse include php zweimal, php unterschied include extends

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:03 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.