OOP class extends

Status
Niet open voor verdere reacties.

ITGuy1990

Gebruiker
Lid geworden
3 nov 2013
Berichten
54
Hallo Forumleden.

Ik heb een class met de naam mysqlHandler. En ik heb een class pageHandler. pageHandler extends mysqlHandler.
Nu maak ik net een nieuwe class die ook mysqlHandler moet extenden. Dit gaat tot mijn verbazing niet:
Fatal error: Class 'mysqlHandler' not found in C:\www\classes\dataHandler.class on line 2

op die regel 2 staat gewoon: class Handler extends mysqlHandler{
Dan een witte regel en een sluitende bracket.

Hoe los ik dit nu het beste op? de mysqlHandler ga ik nog nodig hebben in meerdere andere classess. Dus ik wil liever de bestaande classess zo laten omdat ze gewoon werken.

ITGuy1990
 
Laatst bewerkt:
Het lijkt me niet per se een extends probleem, maar ergens een include of een rechten probleem op een file. Of je extend de verkeerde class. Je extend mysqliJg bestaat die?
 
Wat je zegt klopt helemaal in het voorbeeld zoals ik het typte. De mysqlHandler heet in het echt mysqliJg. Ik heb alles "vertaald" om verwarring te voorkomen. Sorry daarvoor.

Dus..je oplossing voor het probleem klopt wel zoals ik t getypt had. Maar in het echt klopt t wel.

Het lijkt er gewoon op dat je van een bepaalde klas maar 1 keer kan extenden. Het lijkt erop dat "pageHandler extends mysqlHandler" gewoon kan maar daarna niet meer "settingsHandler extends mysqlHandler" kan doen. Zou dat kunnen kloppen? Zo ja, heb je suggesties?
 
Maak het jezelf niet te lastig dan en houdt gewoon de naamgeving zoals je ze gebruikt ;)

Hoe zien de eerste regels van je codes er uit?

Het zou er ongeveer zo uit moeten zien:
mysqliJg.php
PHP:
class mysqliJq {
datahandler.php
PHP:
require_once("mysqliJg.php");
class Handler extends mysqliJg {
 
Compleet overzicht

Index.php:
Code:
#include alle .class bestanden in de map classes
foreach (glob("classes/*.class") as $classfilename) {
	 include $classfilename;
}

De de .class files zien er als volgt uit:

mysqliJg.class:
Code:
class mysqliJg {
# hele reeks methods en property's hieronder
}

pageHandler.class
Code:
class pageHandler extends mysqliJg {
# hele reeks methods en property's hieronder
}

accountHandler:
Code:
class accountHandler extends mysqliJg{
# Is nog leeg. Juist omdat het fout gaat als ik deze include.
}

Dus als ik je goed begrijp moet ik dus bij boven class accountHandler extends mysqliJg gewoon een require_once zetten naar de file met mysqliJg? Ik ga eens wat proberen.
 
Er gebeurt iets wat ik niet goed begrijp. Kijk hier eens naar.

--------SITUATIE 1----------
index.php
Code:
foreach (glob("classes/*.class") as $classfilename) {
echo "Including classfile: ".$classfilename."<br />";	
require_once $classfilename;
}

mysqliJg.class
Code:
class mysqliJg {
#methods en property's
}

pageHandler.class
Code:
class pageHandler extends mysqliJg{
#methods en property's
}

accountHandler.class
Code:
class accountHandler extends mysqliJg{
#methods en property's
}

Resultaat wanneer index.php gedraaid word:
Including classfile: classes/accountHandler.class

Fatal error: Class 'mysqliJg' not found in C:\xampp\htdocs\bic\classes\accountHandler.class on line 3

--------SITUATIE 2----------
index.php
Code:
foreach (glob("classes/*.class") as $classfilename) {
echo "Including classfile: ".$classfilename."<br />";
require_once $classfilename;
}

mysqliJg.class
Code:
class mysqliJg {
#methods en property's
}

pageHandler.class
Code:
require_once "classes/mysqliJg.class";
class pageHandler extends mysqliJg{
#methods en property's
}

accountHandler.class
Code:
require_once "classes/mysqliJg.class";
class accountHandler extends mysqliJg{
#methods en property's
}

resultaat wanneer index.php gedraaid word:
Including classfile: classes/accountHandler.class
Including classfile: classes/mysqliJg.class
Including classfile: classes/pageHandler.class

Waarom werkt situatie 1 niet? Dat begrijp ik niet. Ik require_once bij index.php en daarmee zou t toch goed moeten zijn? Zodra accountHandler.class zijn "require_once "classes/mysqliJg.class";" NIET heeft gaat het fout. bij de pageHandler.class mag ik hem wel weglaten. Dan is er ook niets aan de hand.

#EDIT. Je was me voor met antwoorden. Ik ga je reactie even lezen :)
 
AH! ik zie het. mysqliJg word ingeladen na accountHandler. Hmmzz...

En jou autoload dinges zorgt ervoor dat het wel in de goede volgorde gebeurt? Ik ga er nog eens goed naar kijken.
 
autoload zorgt er voor dat wanneer je een klasse aanroept welke nog niet is gedefineerd hij deze op zal vragen.

De meeste grote PHP frameworks maken hier gebruik van (Zie ook PSR-0)
 
Super bedankt

Ok. Waarom praten ze bij PSR-0 over namespaces? Gewoon om te laten zien dat dat per namespace te gebruiken valt? Ik heb overigens geen ervaring met die namespaces. En beperkte kennis van die namespaces.

ITGuy1990
 
Volgens de documentatie is het niets anders dan een manier om items te groeperen.
What are namespaces? In the broadest definition namespaces are a way of encapsulating items. This can be seen as an abstract concept in many places.

Door gebruik te maken van namespaces kun je (onder andere) onderscheid maken tussen twee klasse met dezelfde naam.

Je kunt er nagenoeg dezelfde structuur voor aanhouden als je mappen :)

/src/Helpmij/Core/Model/Dummy.php
PHP:
namespace Helpmij\Core\Model;

class Dummy {}
/src/Acme/Demo/Model/Dummy.php
PHP:
namespace Acme\Demo\Model;

use Helpmij\Core\Model\Dummy as BaseDummy;

class Dummy extends BaseDummy {}
 
Dankjewel Tha Devil.

Daarmee kan ik mooi beginnen! Er gaat weer een nieuwe wereld open :)
Super voorbeeld trouwens! En nogmaals bedankt :thumb:

ITGuy1990.
 
beste bekijk eens

PHP:
global $_DEBUG ;
$_DEBUG = true;
$klassname="mijnsqlklasse";//zonder wachtwoorden om het veilig te houden
$firstklass = $klassname();
function __autoload($klasse= ''){
    if($include = is_ClassExist($klasse)){
        require_once $include;
    }else{
        global $_DEBUG;
        if($_DEBUG)
        die('ERROR...-CLASS-> Constructions '.$klasse.' niet gevonden');
        die('oeps er ging iets fout zonder veel te zeggen wat er gebeurt want dat mag ik niet zeggen');
    }
}
function is_ClassExist($klasse=''){
    $include = "./mijnlocatievanklasfiles/".$klasse."ext.inc";
    //....... veel controles
    if(file_exists($include)&& is_readable($include)){
        return $include;
    }else{
        return false;
    }
}
 
Laatst bewerkt:
Ik zou zelf gebruik maken van autoloading via Composer maar dat is maar net wat je precies wilt bereiken en hoe jij jouw project op wilt zetten :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan