| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

11-06-2009, 15:24
|
|
andygyr
Registrierter Benutzer
|
|
Registriert seit: Jan 2007
Beiträge: 177
|
|
Datei wird in die Klasse statt in das Skript eingebunden
Hallo zusammen..
Der Titel sagt eigendlich schon relativ viel aus. Ich habe eine Klasse, mit einer Funktion 'LoadComponent()'. Dort sollten Verschiedene Dateien eingebunden werden.
Die Klasse und Funktion führe ich in der admin.php aus. Nun werden die Dateien aber nur in der Klasse eingebunden und nicht im Skript, admin.php.
Kann man dagegen was unternehmen?
|

11-06-2009, 16:11
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
Zitat:
Zitat von andygyr
Kann man dagegen was unternehmen?
|
ja, zuerst mal den code posten.
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

11-06-2009, 16:15
|
|
andygyr
Registrierter Benutzer
|
|
Registriert seit: Jan 2007
Beiträge: 177
|
|
Ich weiss zwar nich was dass bringen soll, aber bitteschön:
Die Funktion in der Klasse 'System':
PHP-Code:
function LoadComponent($ComponentId = false) {
global $db;
// Componenten Daten holen
if($ComponentId && $db->id_select('Component', (int) $ComponentId)) {
$Component = $db->gAssocArray();
} else {
$db->select('Backend_Menue', "MenueStart = 'Yes'");
$db->id_select('Component', $db->g('MenueKomponent'));
$Component = $db->gAssocArray();
if(count($Component)>1) die('Fehler: Mehrere Startkomponenten gewählt!');
}
// Files includes
foreach (glob(self::$S_INCLUDES_BACKEND_COMPONENTS_PATH.$Component[0]['ComponentPfad']."*.php") as $file) {
include($file);
}
return true;
}
Ausschnitt admin.php:
PHP-Code:
// Dieser abschnitt ist unschön gelöst, ich weiss. Ist aber nur vorübergehend
if(isset($_GET[System::$S_BACKEND_GET_VARS['component']])) {
define('G_COMP', $_GET[System::$S_BACKEND_GET_VARS['component']]);
} else {
define('G_COMP', false);
}
//..
$sys = new System; // System Starten
//..
// Component laden
$sys->LoadComponent(G_COMP);
|

11-06-2009, 16:26
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
das sieht alles nicht sehr koscher aus. zuerst solltest du auf global verzichten, das bringt dich in des teufels küche. ansonsten folgendes.
du greifts hier bereits auf eine eigenschaft der klasse system zu:
PHP-Code:
System::$S_BACKEND_GET_VARS['component']
das geht aber unter php5 nur, wenn diese als static deklariert wurde. ist dem so? außerdem solltest du die sichtbarkeitsstufen bei deinem methoden deklarieren.
dann würde ich mir mal __autoload ansehen. die setzt du in der admin.php ein. ist imho viel einfacher und eleganter.
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

11-06-2009, 16:30
|
|
andygyr
Registrierter Benutzer
|
|
Registriert seit: Jan 2007
Beiträge: 177
|
|
static ist gesetzt.
__autoload() wird nicht funktionieren, da ich nicht nur Klassen sondern auch andere php Dateien einbinde..
|

11-06-2009, 16:39
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
error_reporting richtig eingestellt? was ergibt bei include($file) denn ein zusätzliches echo $file?
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

11-06-2009, 16:51
|
|
andygyr
Registrierter Benutzer
|
|
Registriert seit: Jan 2007
Beiträge: 177
|
|
error_reporting ist auf E_ALL, so ziemlich in jeder Datei ^^
Wenn ich vor include($file); ein echo $file; mache, wird der Korrekte Dateinamen ausgespuckt.
Die erste Datei die eingebunden wird greift auf die Variable $sys zu. $sys wurde ja in der admin.php gestartet. Da kommt dann entsprechend auch die Antwort: Notice: Undefined variable: sys in /srv/www/vhosts/cogax.ch/httpdocs/Cogax_CMS/includes/backend/components/components/Components.php on line 7
Darum weiss ich ja, dass die Datei nur in die Klasse und nicht direkt in die admin.php eingebunden wird. Wenn ich echo $file; nach dem include($file); hinsetzte, kommt natürlich nix, da Das Skript beim Fehler abgebrochen wird.
|

11-06-2009, 17:17
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
du erzeugst in der admin.php eine referenz auf die system-klasse. in der bindest du dann dateien ein. die können aber keinen zugriff auf $sys haben, da es keine normale variable sondern eine referenz ist. und wie willst du darauf zugreifen? das kann doch nicht funktionieren:
PHP-Code:
// test.php
<?php
$files = array ( 'bla.php', 'blubb.php');
include ('class.php');
$sys = new sys;
$sys -> incl($files);
?>
// class.php
<?php
class sys
{
public function incl($arr)
{
foreach ($arr as $value)
{
include ($value);
}
}
public function bla()
{
echo 'Blubb';
}
}
?>
// blubb.php
<?php
// und hier hauts dir eine fehlermeldung um die ohren
$sys -> bla();
?>
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

11-06-2009, 17:29
|
|
andygyr
Registrierter Benutzer
|
|
Registriert seit: Jan 2007
Beiträge: 177
|
|
Ja, dein Codebeispiel entspricht ziemlich genau meinem Problem. Un dies ist nich weil $sys eine spezielle Vriabel ist, sondern weil die Dateien in die Klasse und nicht in die admin.php eingebunden werden. Bei einer stinknormalen Variabel passiert genau das gleiche:
PHP-Code:
// test.php <?php $files = array ( 'bla.php', 'blubb.php'); $xx = 'Blablabla'; include ('class.php'); $sys = new sys; $sys -> incl($files); ?> // class.php <?php class sys { public function incl($arr) { foreach ($arr as $value) { include ($value); } } public function bla() { echo 'Blubb'; } } ?> // blubb.php <?php // und hier hauts dir eine fehlermeldung um die ohren echo $xx; $sys -> bla(); ?>
Hier hab ich noch ne 'normale variabel' $xx angefügt. Es erscheint der gleiche Fehler: Notice: Undefined variable: xx in /srv/www/vhosts/cogax.ch/httpdocs/Cogax_CMS/includes/backend/components/components/Components.php on line 2
|

11-06-2009, 17:37
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Der inkludierte Code erbt den aktuellen Scope. In diesem existiert dein $sys einfach nicht. Ein global $sys würde es importieren - und deutlich machen wie verkorkts die Architektur ist.
Das hat übrigens nichts mit Klassen zu tun sondern ist eine Eigenschaft des Include-Mechanismus, funktioniert also auch mit einfachen Funktionen.
PHP-Code:
<?php // foo.php
$a = 'foo';
function foo() { // global $a; // <-- damit gehts include 'bar.php'; }
foo();
PHP-Code:
<?php // bar.php
echo $a;
Geändert von onemorenerd (11-06-2009 um 17:42 Uhr)
|

11-06-2009, 17:49
|
|
andygyr
Registrierter Benutzer
|
|
Registriert seit: Jan 2007
Beiträge: 177
|
|
Achso.. OK, vielen Dank es geht!
ps: Verkorkst ist da gar nix
|

11-06-2009, 18:01
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
Zitat:
Zitat von andygyr
ps: Verkorkst ist da gar nix 
|
doch! sobald man mit global arbeiten muss, ist es verkorkst. sorry, aber isso.
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

12-06-2009, 16:19
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von andygyr
Achso.. OK, vielen Dank es geht!
ps: Verkorkst ist da gar nix 
|
Das Wunderbare an der Arbeit mit Objekten[1] ist, dass alle Funktionen (Methoden) eines Objektes Zugriff auf beliebig viele gemeinsame Variablen (Properties) haben dürfen. Wenn da noch jemand mit globalen Variablen hantiert, darf man dessen Arbeits- oder Denkweise durchaus verkorkst nennen. ;-)
--
[1] Gleiches gilt für Klassen.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|