php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
classen dynamisch laden


 
sanktusm
10-09-2016, 12:36 
 
Hallo,
ich suche eine kompakte Lösung um Klassen zu laden:

über class1 extends class2 ist das ja leicht möglich. Nun möchte ich classen die in Ordner abgelegt werden dynamisch laden sodass man die classe nur in den Ordner ablegen und automatisch integrieren kann:


<?php
class class1 {
public function __construct() {
echo "myClass init'ed successfuly!!!";
}

public function test ($mytext) {

echo $mytext;
}
}
?>

<?php
class class2 {
public function __construct($class) {


$this -> new $class();





echo "class 2 init'ed successfuly!!!";
}
}
?>

<?php
$classes = Array('class1','class2');
class ClassAutoloader {
public function __construct() {
spl_autoload_register(array($this, 'loader'));
}
private function loader($className) {
echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n";
include $className . '.php';
}
}

$autoloader = new ClassAutoloader();

foreach($classes as $class)
$obj = new $class();

$obj -> text('hier steht was'); //findet die Funktion nicht

?>



Mein Frage: Geht das irgendwie?

 
h3ll
10-09-2016, 19:14 
 
Was gefällt dir an den hunderten bis tausenden bestehenden Autoloadern nicht? Was soll deiner können, was andere nicht können?

 
sanktusm
19-09-2016, 13:33 
 
?

 
h3ll
19-09-2016, 13:41 
 
?

Wozu programmierst du das?

 
DivDax
28-09-2016, 16:28 
 
Ich würde dir raten composer zu verwenden. Damit hast du einen funktionierenden autoloader und Paketverwaltung. ;)

 
mermshaus
28-09-2016, 22:59 
 
Ich bin auch durchaus dafür, Composer zu nutzen. Das ergibt selbst dann Sinn, wenn keine externen Abhängigkeiten vorliegen. Composer erzeugt auch Autoloader für eigenen Quellcode.

Ansonsten ist die Sache aber mit ungefähr so einem Code grundsätzlich auch erledigt:

spl_autoload_register(function ($className) {
$path = __DIR__ . '/src/' . str_replace('\\', '/', $className) . '.php';

if (file_exists($path)) {
require $path;
}
});

Ein new Foo\Bar\Whatever(); würde etwa versuchen, die Datei ./src/Foo/Bar/Whatever.php einzubinden.

Eine Klasse pro Datei, Namespaces entsprechen Verzeichnisstruktur.

Autoloading ist ein gelöstes Problem.

Zum Eröffnungspost:

Die Funktion ist eine Methode und heißt bei deiner class1 test und nicht text.

Der Code von class2 ist syntaktisch fehlerhaft, und die foreach-Schleife tut vermutlich auch nicht das, was sie soll. Da fehlen vermutlich geschweifte Klammern, um die beiden nachfolgenden Statements zu gruppieren.

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:36 Uhr.