php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 11-06-2009, 16:24
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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?
Mit Zitat antworten
  #2 (permalink)  
Alt 11-06-2009, 17:11
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von andygyr Beitrag anzeigen
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
Mit Zitat antworten
  #3 (permalink)  
Alt 11-06-2009, 17:15
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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); 
Mit Zitat antworten
  #4 (permalink)  
Alt 11-06-2009, 17:26
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #5 (permalink)  
Alt 11-06-2009, 17:30
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

static ist gesetzt.
__autoload() wird nicht funktionieren, da ich nicht nur Klassen sondern auch andere php Dateien einbinde..
Mit Zitat antworten
  #6 (permalink)  
Alt 11-06-2009, 17:39
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #7 (permalink)  
Alt 11-06-2009, 17:51
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #8 (permalink)  
Alt 11-06-2009, 18:17
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #9 (permalink)  
Alt 11-06-2009, 18:29
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #10 (permalink)  
Alt 11-06-2009, 18:37
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

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 18:42 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 11-06-2009, 18:49
andygyr
 Registrierter Benutzer
Links : Onlinestatus : andygyr ist offline
Registriert seit: Jan 2007
Beiträge: 183
andygyr ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Achso.. OK, vielen Dank es geht!

ps: Verkorkst ist da gar nix
Mit Zitat antworten
  #12 (permalink)  
Alt 11-06-2009, 19:01
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von andygyr Beitrag anzeigen
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
Mit Zitat antworten
  #13 (permalink)  
Alt 12-06-2009, 17:19
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von andygyr Beitrag anzeigen
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.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wie kann man eine Herarchische Navi aufbauen, die eingebunden wird? BananaJo PHP Developer Forum 2 02-11-2008 17:21
Wieso funktioniert <marquee></marquee> nicht, wenn es mit Ajax eingebunden wird? HansDerLange HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 18 24-07-2008 22:19
PHP Datei wird runtergeladen statt geparsed peon2t Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 4 18-02-2007 21:26
[PHP5] PDF-Datei wird im Browser statt mit 100% mit 154% angezeigt! bigtail PHP Developer Forum 7 18-08-2006 13:10
PHP-Skript download statt Ausführung AlexK-Mainz Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 4 20-05-2003 13:53

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:18 Uhr.