1Danke
ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
247
247
EMPFEHLEN
-
30.01.12 10:32 #1
Hallo zusammen
Ich komme hier irgendwie nicht weiter. Ich habe eine Autoload-Funktion, welche mir Klassen-Dateien laden soll, falls noch nicht geschehen:
Die Konstanten, welche die unterschiedlichen Verzeichnisse enthalten sind korrekt.PHP-Code:function __autoload($className){
$arrDirectories = array(
PATH_APP_CLASS,
PATH_APP_CONTR,
PATH_APP_MODEL,
PATH_AR_CLASS,
PATH_AR_CONTR,
PATH_AR_FUNCT,
PATH_AR_MODEL
);
foreach($arrDirectories as $directory){
if(file_exists($directory.'/'.$className.'.php')){
require($directory.'/'.$className.'.php');
break;
}
}
}
Nun funktioniert so weit auch. Nun habe ich eine Methode geschrieben, welche eine neue Instanz einer Klasse generieren und allfällige Argumente mitgeben soll:
Das funktioniert so weit eigentlich auch.PHP-Code:class arHelper {
static public function newInstance(){
$className = func_get_arg(0);
$numArgs = func_num_args();
if($numArgs > 1){
$arrArgs = func_get_args();
$argList = '';
foreach($arrArgs as $key => $arg){
if($key > 0){
$argList .= '$arrArgs['.$key.'],';
}
}
$argList = substr($argList, 0, -1);
}
if(isset($argList)){
$res = eval("return new $className($argList);");
} else{
return new $className;
}
}
}
Doch in dem folgenden Code, wird auf der zweiten Zeile der Methode initExtension() versucht eine Instanz der Klasse 'ar_login' zu erstellen.
Dabei tritt folgender Fehler auf: Fatal error: Class 'ar_login' not found in /Users/username/Sites/applicationname/ar/class/arHelper.php(18) : eval()'d code on line 1
Und dies, ohne
überhaupt die Autoloader-Funktion ausgeführt zu haben!
Was ist da falsch? Ich stehe da total auf dem Schlauch...PHP-Code:<?php
class arBase {
protected $output = 'html';
protected $arrCss = array();
protected $arrJs = array();
function __construct(){
$GLOBALS['DB'] = arHelper::newInstance('arDatabase', DB_HOST, DB_USER, DB_PASS, DB_DBASE, DB_PORT);
}
public function createOutput(){
if(APP_LOGIN_NECESSARY && !isset($_SESSION['userId'])){
$currentExt = 'ar';
$currentCtr = 'login';
$currentAct = 'index';
}
$this->tmpl = arHelper::newInstance('arTemplate');
$this->tmpl->setOutput($this->getOutput());
$this->tmpl->assign(array(
'appAuthor' => APP_AUTHOR,
'appTitle' => APP_NAME,
'appCharset' => APP_CHARSET,
'appDescription' => APP_DESCRIPTION,
'appKeywords' => APP_KEYWORDS
));
$this->tmpl->addJsArr($this->getJsArr());
$this->tmpl->assign('content', $this->initExtension($currentExt, $currentCtr, $currentAct));
return $this->tmpl->create(PATH_TEMPLATE_MAIN);
}
protected function getJsArr(){
return $this->arrJs;
}
public function getOutput(){
return $this->output;
}
protected function initExtension($ext, $ctr, $act){
$extensionName = $ext.'_'.$ctr;
$extension = arHelper::newInstance($extensionName, $ext, $ctr, $act);
// return $extension->$act();
}
}
?>
Vielen Dank schon im Voraus für jede Hilfe!
Grüsse,
3DnavigatorMaxon über Thinking Particles: "Würde man einem Animator diese Arbeit 'von Hand' zumuten, wäre er sicherlich bis an den Rest seiner Tage gut beschäftigt, falls er nicht durch geistige Qualen, die ihm diese Aufgabe zweifellos bereiten würde, ein frühes Ende findet. Damit ihm dieses Schicksal erspart bleibt, gibt es Thinking Particles."
--------------------------------
Cinema 4D R11 64bit
Apple iMac 2011, 27", Quad-core 3.4GHz Intel Core i7, 32GB RAM, SSD & HDD
-
30.01.12 20:15 #2
Weiss keiner einen Rat?
Ich habe in meiner Verzweiflung weiter gesucht und folgendes festgestellt:
1. In der constructor-Methode der arBase-Klasse funktioniert der Aufruf von arHelper::newInstance() problemlos. Auch wie Parameter werden alle übergeben, die notwendige Klasse inkl. Elternklassen werden korrekt und sauber gesucht und geladen.
2. Egal wie ich in der Methode createOutput() der gleichen Klasse diese Methode aufrufe, schlägt diese jedoch mit der genannten Fehlermeldung fehl.
Ich komme aber nicht drauf, was zu diesem Verhaltensunterschied führt.. Weiss jemand was nützliches?
Besten Dank schon im Voraus & Grüsse!Maxon über Thinking Particles: "Würde man einem Animator diese Arbeit 'von Hand' zumuten, wäre er sicherlich bis an den Rest seiner Tage gut beschäftigt, falls er nicht durch geistige Qualen, die ihm diese Aufgabe zweifellos bereiten würde, ein frühes Ende findet. Damit ihm dieses Schicksal erspart bleibt, gibt es Thinking Particles."
--------------------------------
Cinema 4D R11 64bit
Apple iMac 2011, 27", Quad-core 3.4GHz Intel Core i7, 32GB RAM, SSD & HDD
-
Da evil, äh eval, eine eigene PHP-Instanz darstellt denke ich, dass diese PHP-Instanz deinen Autoloader und eben auch die zu instanzierende Klasse nicht kennt.
Ist die Klasse ar_login die einzige Klasse die Argumente im Konstruktor erwartet?
Gruß
-
30.01.12 20:34 #4
@Raisch: Nein, auch andere Klassen (siehe arDatabase in der arBase::__constructor Methode) erwartet Argumente. Dort funktionierts.
Konnte aber nun das Problem beheben;
Habe herausgefunden, dass das Problem lediglich nach dem Import der Smarty.class.php Datei auftrat (wird im Rahmen der arTemplate-Klasse geladen). Ich gehe deshalb nun davon aus, dass diese Klasse meine Autoloader-Methode überschreibt.
Nun habe ich als Lösung die initExtension-Methode einfach vor dem Instanzieren von arTemplate (und damit auch der Smarty-Klasse) gesetzt.
Nun funktioniert es wie erwartet..
Das war wohl eine Zangengeburt... grmpf..
Aber danke für die Überlegungen!
Grüsse aus der SchweizMaxon über Thinking Particles: "Würde man einem Animator diese Arbeit 'von Hand' zumuten, wäre er sicherlich bis an den Rest seiner Tage gut beschäftigt, falls er nicht durch geistige Qualen, die ihm diese Aufgabe zweifellos bereiten würde, ein frühes Ende findet. Damit ihm dieses Schicksal erspart bleibt, gibt es Thinking Particles."
--------------------------------
Cinema 4D R11 64bit
Apple iMac 2011, 27", Quad-core 3.4GHz Intel Core i7, 32GB RAM, SSD & HDD
-
Um Autoloadkollisionen zu vermeiden, kann ich Dir dieses empfehlen:
Ich hatte das mal so gelöst:
GrußPHP-Code:/**
* Class to load unloaded classfiles.
*
* @abstract
* @author Rainer Schulz
* @link http://raischblog.de/
* @copyright 2011 - Rainer Schulz
* @license CC BY-NC-SA 3.0 <http://creativecommons.org/licenses/by-nc-sa/3.0/>
* @version 2.0 02/12/2011 14:13
*/
abstract class RsAutoLoad
{
private static $arrPath = null;
private static $arrExt = null;
public static function init( $strClassPath,
$strInterfacePath,
$strLibraryPath,
$strModelPath,
$strViewPath,
$strControllerPath )
{
self::$arrPath = array (
'class' => $strClassPath,
'interface' => $strInterfacePath,
'library' => $strLibraryPath,
'model' => $strModelPath,
'view' => $strViewPath,
'controller' => $strControllerPath
);
self::$arrExt = array(
'class' => '.class.php',
'interface' => '.interface.php',
'library' => '.library.php'
);
spl_autoload_register( 'RsAutoLoad::loadClass' );
spl_autoload_register( 'RsAutoLoad::loadLibrary' );
spl_autoload_register( 'RsAutoLoad::loadController' );
spl_autoload_register( 'RsAutoLoad::loadModel' );
spl_autoload_register( 'RsAutoLoad::loadView' );
spl_autoload_register( 'RsAutoLoad::loadInterface' );
}
public static function loadClass( $strClass )
{
return self::registerClass(
self::$arrPath['class'].$strClass.self::$arrExt['class']
);
}
public static function loadInterface( $strClass )
{
return self::registerClass(
self::$arrPath['interface'].$strClass.self::$arrExt['interface']
);
}
public static function loadLibrary( $strClass )
{
return self::registerClass(
self::$arrPath['library'].$strClass.self::$arrExt['library']
);
}
public static function loadModel( $strClass )
{
return self::registerClass(
self::$arrPath['model'].$strClass.self::$arrExt['class']
);
}
public static function loadView( $strClass )
{
return self::registerClass(
self::$arrPath['view'].$strClass.self::$arrExt['class']
);
}
public static function loadController( $strClass )
{
return self::registerClass(
self::$arrPath['controller'].$strClass.self::$arrExt['class']
);
}
private static function registerClass( $strFile )
{
if ( is_file( $strFile ) )
{
require $strFile;
return true;
}
return false;
}
}
-
30.01.12 20:58 #6
Wow, das ist ja genial! Hab' ich bereits vereinfacht bei mir implementiert und funktioniert nun auch sauber nach dem Include von Smarty.class.php!
Vielen vielen Dank - da hab' ich mal wieder was gescheites gelernt!Maxon über Thinking Particles: "Würde man einem Animator diese Arbeit 'von Hand' zumuten, wäre er sicherlich bis an den Rest seiner Tage gut beschäftigt, falls er nicht durch geistige Qualen, die ihm diese Aufgabe zweifellos bereiten würde, ein frühes Ende findet. Damit ihm dieses Schicksal erspart bleibt, gibt es Thinking Particles."
--------------------------------
Cinema 4D R11 64bit
Apple iMac 2011, 27", Quad-core 3.4GHz Intel Core i7, 32GB RAM, SSD & HDD
Ähnliche Themen
-
Propel Autoload
Von affiliate_g im Forum PHPAntworten: 1Letzter Beitrag: 22.03.10, 22:38 -
c++ autoload für klassen?
Von EM-Autotechnik im Forum C/C++Antworten: 0Letzter Beitrag: 18.09.07, 19:41 -
Normales Surfen, plötzlich kein Inet mehr
Von Jotho im Forum Internet, DSL & FlatrateAntworten: 15Letzter Beitrag: 11.09.05, 17:11 -
Plötzlich kein Capturing mehr?
Von Jotho im Forum Videoschnitt, Videotechnik & -produktionAntworten: 0Letzter Beitrag: 20.11.04, 13:43 -
Plötzlich kein Verbindung zu MySQL
Von Indian im Forum Relationale DatenbanksystemeAntworten: 5Letzter Beitrag: 21.10.04, 15:24





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren