Crew algemeen |
|
Ik heb een class om bestanden mee te bewerken, met daarin onder andere een functie om de inhoud uit te lezen. Heel simpel ziet die er zo uit:
class File {
public $location = null;
public function __construct($location) {
$this->location = $location;
}
public function getContents($location = null) {
$location = isset($this) ? $this->location : $location;
// return de contents
}
}
public $location = null; public function __construct($location) { $this->location = $location; } public function getContents($location = null) { $location = isset($this) ? $this->location : $location; // return de contents } }
Nu kan ik een instance van die class aanmaken en daarna de functie getContents aanroepen, maar dat zou ik tegelijk ook graag statisch willen kunnen doen, met File::getContents() dus.
Helaas geeft dat een strict error:[error]Strict Standards: Non-static method File::getContents() should not be called statically[/error]
Dat klinkt logisch, dus dan maak ik er een static function van door er het keyword static voor te zetten. Nu geeft het statisch aanroepen geen probleem meer, maar bij vanuit een instance aanroepen bestaat de $this variabele niet meer.
Dat is ook logisch omdat php de functie nu als geheel statisch behandelt. Op deze manier kom ik dus niet tot een oplossing.
Als ik dan besluit de strict errors te negeren werkt dit opzich goed, todat ik het volgende probeer:
class Andere {
public function doeWat($location) {
echo strrev(File::getContents($location));
}
}
$andere = new Andere;
$andere->doeWat('bestand.txt');
class Andere { public function doeWat($location) { } } $andere = new Andere; $andere->doeWat('bestand.txt');
Dan krijg ik een vanuit de eerste regel van m'n getContents functie:[error]Notice: Undefined property: Andere::$location[/error]Php vindt blijkbaar dat $this gedefinieerd is in getContents() als ik getContents() vanuit een andere instance aanroep.
Zoiets heb ik nog nooit eerder meegemaakt, dus ik ben gaan zoeken of het misschien een bug in php is. Toen kwam ik dit tegen:
http://bugs.php.net/bug.php?id=9005
Daarin wordt uitgelegd dat dit helemaal klopt en juist handig zou zijn:Citaat: class::method() isn't a static call in PHP (it isn't always a static
call in C++ either).
The primary use for class::method() is actually calling methods from
your parent class, not calling 'static methods' (the ability to create
static classes and call their methods is pretty much a positive 'side
effect').
So, this is the intended behavior.
Handig of niet, hierdoor kan ik mijn probleem niet oplossen. Heeft iemand een idee hoe ik dit wel aan zou moeten pakken?
Aan antwoorden als: "Waarom gebruik je niet gewoon file_get_contents()?" heb ik niets, want in getContents() moet meer gebeuren dan alleen file_get_contents() aan roepen. Voor de geïnteresseerden: er wordt bijboorbeeld rekening gehouden met het include path.
|