PHP - Autoload und Jquery

live4music

Mitglied
Guten Abend :)

Sitze schon seit 2 Tagen an dem PHP-Autoloader und bin keinen Stück weiter gekommen.

Bei mir im Backendbereich werden alle Klassen mit "autoload" geladen, es funktioniert auch alles einwandfrei. Jetzt will ich meine Frontend - Daten, die ich mit Jquery an Backend(helper.php) übergebe an bestimmte Klassen weiter zu schicken, wo die dann weiter verarbeitet werden.

so sieht mein helper.php aus(ist nur ein Testbeispiel)

PHP:
<?php

include_once '../system/classes/main.php';

/* 

Da der Helper nur von Jquery aufgerufen wird, theoretisch muss der Autoloader hier noch einmal geladen werden, oder ? 
weil sonst die Klassen nicht mehr erkannt werden.

include_once '../system/autoload.php'; 

*/


$get = $_POST["get"];

if ($get == "getRegister") {
	$username = $_POST["username"];
	$email = $_POST["email"];

	$main = new main();
	$main->getRegister($username, $email);
}

?>

ist halt nur ein Kontroller. Und von "helper.php" werden die Daten an eine Klasse namens "main" übergeben und von hier aus werden alle Daten an bestimmte Module (wie z.B. user.class.php oder system.class.php usw...) verteilt.

Bis auf Main.php kommen alle Daten normal an, aber sobald ich versuche in der Klasse "main" ein bestimmtes Modul zu laden, bekomme ich immer einen Error, dass die Klasse nicht gefunden werden konnte.

Meine "main.php"

PHP:
<?php
namespace system\classes;

use system\classes\system\system;

class main {
	
	/**
	 * Register new user
	 * 
	 * @param string $username
	 * @param string $email
	 */
	public function getRegister($username, $email) {
		$system = new system();
		$system->setRegister($username, $mail);
	}
	
	
}

?>

Weißt Ihr vllt. woran es liegen könnte, oder wie man es lösen könnte ? ? weil ich habe schon keine Ideen mehr...


Dankeschön für euere Feedbacks ! ! !
 
Zuletzt bearbeitet:
Hallo live4music,

dazu müsste man a) deine Autoloader-Fkt. einsehen können und b) deine Ordnerstruktur (inkl. den Dateien) wissen.

Welche Klasse wird genau nicht gefunden? Die system im Beispiel?
 
Hallo live4music,

dazu müsste man a) deine Autoloader-Fkt. einsehen können und b) deine Ordnerstruktur (inkl. den Dateien) wissen.

Welche Klasse wird genau nicht gefunden? Die system im Beispiel?


Ja die System-Klass und alle die ich versuche in der Main - Klasse zu laden.



PHP:
<?php

spl_autoload_register('im_autoload', 'loader');
function im_autoload($classname) { autoload::loader($classname); }

final class autoload {
	
	/**
	 * Loader.
	 * 
	 * @param string $classname
	 * 
	 * @throws Exception
	 */
	public static function loader($classname) {
		try {
			// Replace Namespace-Sperator
			$path = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
			
			// Check Start-Slash
			if(strpos($path, DIRECTORY_SEPARATOR) !== 0) {
				$path = DIRECTORY_SEPARATOR.$path;
			}
			
			// Add File-Extension
			$path = $path . '.php';
			if(!file_exists(ROOT_DIR . $path)) {
				return false;
			}
			
			 require_once $path;
		
		} catch (Exception $e) {
			return false;
		}
	}
}

?>

Ordnerstruktur
1381017358-clip-7kb.png
 
Zuletzt bearbeitet:
so funkt. es lieder nicht hab ich schon versucht

Doch, so funktioniert es. Beziehungsweise passiert das, was passieren soll:

Code:
$ pwd
/live4music/system

$ tree --charset ascii .
.
|-- classes
|   `-- main.php
`-- helper.php

1 directory, 2 files

$ cat classes/main.php 
<?php

namespace system\classes;

use system\classes\system\system;

class main {

    /**
     * Register new user
     *
     * @param string $username
     * @param string $email
     */
    public function getRegister($username, $email) {
        $system = new system();
        $system->setRegister($username, $mail);
    }


}

$ cat helper.php 
<?php
$_POST['get'] = 'getRegister';
$_POST['username'] = 'Steve';
$_POST['email'] = 'steve@example.org';

include_once '../system/classes/main.php';

/*

Da der Helper nur von Jquery aufgerufen wird, theoretisch muss der Autoloader hier noch einmal geladen werden, oder ?
weil sonst die Klassen nicht mehr erkannt werden.

include_once '../system/autoload.php';

*/


$get = $_POST["get"];

if ($get == "getRegister") {
    $username = $_POST["username"];
    $email = $_POST["email"];

    $main = new system\classes\main();
    $main->getRegister($username, $email);
}

$ php -f helper.php 
PHP Fatal error:  Class 'system\classes\system\system' not found in /live4music/system/classes/main.php on line 16
PHP Stack trace:
PHP   1. {main}() /live4music/system/helper.php:0
PHP   2. system\classes\main->getRegister() /live4music/system/helper.php:25

Wenn du da nur new main() stehen hast, ist das schlicht und ergreifend der falsche Klassenname.

Ansonsten: Hast du das Zeugs geschrieben oder baust du an einem fertigen System rum?
 
Doch, so funktioniert es. Beziehungsweise passiert das, was passieren soll:

Code:
$ pwd
/live4music/system

$ tree --charset ascii .
.
|-- classes
|   `-- main.php
`-- helper.php

1 directory, 2 files

$ cat classes/main.php 
<?php

namespace system\classes;

use system\classes\system\system;

class main {

    /**
     * Register new user
     *
     * @param string $username
     * @param string $email
     */
    public function getRegister($username, $email) {
        $system = new system();
        $system->setRegister($username, $mail);
    }


}

$ cat helper.php 
<?php
$_POST['get'] = 'getRegister';
$_POST['username'] = 'Steve';
$_POST['email'] = 'steve@example.org';

include_once '../system/classes/main.php';

/*

Da der Helper nur von Jquery aufgerufen wird, theoretisch muss der Autoloader hier noch einmal geladen werden, oder ?
weil sonst die Klassen nicht mehr erkannt werden.

include_once '../system/autoload.php';

*/


$get = $_POST["get"];

if ($get == "getRegister") {
    $username = $_POST["username"];
    $email = $_POST["email"];

    $main = new system\classes\main();
    $main->getRegister($username, $email);
}

$ php -f helper.php 
PHP Fatal error:  Class 'system\classes\system\system' not found in /live4music/system/classes/main.php on line 16
PHP Stack trace:
PHP   1. {main}() /live4music/system/helper.php:0
PHP   2. system\classes\main->getRegister() /live4music/system/helper.php:25

Wenn du da nur new main() stehen hast, ist das schlicht und ergreifend der falsche Klassenname.

Ansonsten: Hast du das Zeugs geschrieben oder baust du an einem fertigen System rum?

es klappt leider nicht immer dasselbe :( Der Ordner System wurde in Core umbenannt.
Code:
<b>Fatal error</b>:  Class 'system\classes\core\system' not found in <b>Z:\home\engine\www\system\classes\main.php</b> on line <b>12</b><br />


ja, das alles habe ich geschrieben...
 
Okay. Ich frage, weil man dann besser inhaltlich antworten kann.

Wenn es dein Autoloader tut, musst du im Grunde wirklich nur den einbinden und auf das passende Verzeichnis zeigen lassen.

Ich würde mal nur den in helper.php inkludieren und dir in der loader-Methode ausgeben lassen, welcher Pfad tatsächlich per file_exists geprüft wird usw.

Rufst du helper.php eigentlich direkt auf oder wird die Datei selbst irgendwo inkludiert? Im ersten Fall: Ist ROOT_DIR gesetzt?

Generell Tipps zum Debugging: http://phpforum.de/forum/showthread.php?t=216988

Am Rande: spl_autoload_register('im_autoload', 'loader'); ? Das zweite Argument passt nicht (siehe Doku)
 
Problem wurde gelöst... hab nur diese 2 Zeilen bissl verändert und danach hat alles funktioniert.


PHP:
// Add File-Extension
			$path = $_SERVER["DOCUMENT_ROOT"] . $path . '.php';

			if(!file_exists($path)) {
				return false;
			}

Danke für eure Feedbacks ! !
 
Zuletzt bearbeitet:
Zurück