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 Thema bewerten
  #1 (permalink)  
Alt 15-07-2009, 21:48
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard global loswerden

guten abend an die gemeinde,

ich hab ein kleines problem ... ich entwickle mir derzeit eine page in OOP soweit ichs kann ^^ aber hab jetzt ein anliegen

hier eine beispiel function:

PHP-Code:
public function footer() 
{
global 
$temp;
    
$temp->assign(array(
            
'DEBUG'        =>    $db->debug()
                    ));
        
$temp->display('footer.tpl');

das global $temp; stört mich ich kann auf die smarty class aber nicht ohne das global zugreifen:

Zitat:
Fatal error: Call to a member function display() on a non-object in blablabla..
die classen werden mit folgendem script geladen:

start.php
PHP-Code:
$workpath $_SERVER["DOCUMENT_ROOT"];
require_once(
"$workpath/lib/Factory.php");
define'_CLASS_PATH_''/home/mpl/www/lib/' ); 

try { 
$conf     Factory::get'config::Config' );
$db     Factory::get'database::MysqlDB' ); 
$temp    Factory::get'smarty::Smarty' ); 
$user     Factory::get'user::userhandler' ); 
$page     Factory::get'mainpage::Mainpage' ); 
$bbcode Factory::get'mainpage::BBcode' ); 
}catch( 
Exception $e ) { 
    echo 
$e->getMessage(); 

und das is der teil aus der factory.php

PHP-Code:
class Factory 
  
  public static function 
get($class_name$params null) { 
  
  if( !
is_string($class_name) || ! trim($class_name) ) { 
    throw new 
Exception'kein gültiger Klassenname' ); 
  } 
  
  
// gibt es die Klasse überhaupt  
  
$file _CLASS_PATH_.strtolowerstr_replace'::'DIRECTORY_SEPARATOR$class_name ).'.class.php' ); 
  if( !
file_exists$file ) ) { 
    throw new 
Exception'Datei nicht gefunden' ); 
  } 
  
  require_once 
$file
  try{ 
  
$tmp explode'::'$class_name ); 
  
$name array_pop$tmp ); 
  
$obj = new $name$params ); 
  }catch( 
Exception $e ) { 

  throw new 
Exception'Fehler beim Konstruieren des Objektes: '.$e->getMessage() ); } 
  return 
$obj
  } 

hab die abstract factory aus nem forum über google gefunden um das global problem zu lösen aber klappt leider nicht


würde mich freuen wenn mir jemand weiter hilft


danke
Mit Zitat antworten
  #2 (permalink)  
Alt 15-07-2009, 23:09
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

Wenn dich global stört (völlig zurecht), dann brauchst du halt einen Scope drumherum. Was läge da näher als um die Deklaration von $temp eine Klasse zu schreiben?
Mit Zitat antworten
  #3 (permalink)  
Alt 15-07-2009, 23:18
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

öhmm okay verstehe ich nicht sry bin anfänger kann mir das jemand genauer erklären? vllt mit beispielen am obrigen code
Mit Zitat antworten
  #4 (permalink)  
Alt 15-07-2009, 23:57
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
/**
 * Class Registry
 * globaler Behaelter fuer die Variablen und objecten, der statt global verwendet wird
 * Singelton
 * @autor Slava
 * @example 
 * //instanzieren
 * $r=Registry::getInstance();
 * $r->ding=new stdClass();
 * $r->ding->test='hallo wellt';
 *  
 * //und dann irgendwo in einer funktion oder anderer stelle
 * $a=Registry::getInstance();
 * if(isset($a->ding->test)) 
 * echo $a->ding->test;
 *
 */
class Registry
{
    
/**
     * behaelter fuer die objecte und variablen
     * @staticvar registry
     * @access protected
     */
    
protected static $registry;

    
/**
     * factory singelton methode zum aufrufen von Registry instance
     *
     * @return Registry
     */
    
public static function getInstance()
    {
        if(!isset(
self::$registry))
        
self::$registry=new self();

        return 
self::$registry;
    }

    
/**
     * konstructor
     * @access private
     */
    
private function __construct()
    {
        
self::$registry=new stdClass();
    }

    
/**
     * magische methode __get
     *
     * @param string $was
     * @return mixed
     */
    
public final function __get($was)
    {
        return 
self::$registry->$was;
    }

    
/**
     * magische methode __set
     *
     * @param string $was
     * @param mixed $wert
     */
    
public final function __set($was,$wert)
    {
        
self::$registry->$was=$wert;
    }

    
/**
     * magische methode __isset
     *
     * @param string $was
     * @return bool
     */
    
public final function __isset($was)
    {
        return isset(
self::$registry->$was);
    }
}
#end class Registry 
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #5 (permalink)  
Alt 16-07-2009, 00:11
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

hmm also per registry.. so hab ichs bereits aber hab auf ne andere lösung gehofft :/

danke
Mit Zitat antworten
  #6 (permalink)  
Alt 16-07-2009, 00:18
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von coty Beitrag anzeigen
hmm also per registry.. so hab ichs bereits aber hab auf ne andere lösung gehofft :/
andere lösung wäre
$GLOBALS['temp'];
unterscheidet sich aber in grunde kaum von
global $temp;
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #7 (permalink)  
Alt 16-07-2009, 00:21
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

ja gut ne dann bleib ich doch lieber beim registry

vielen dank
Mit Zitat antworten
  #8 (permalink)  
Alt 16-07-2009, 00:42
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

Von config:: bis user:: würde ich das in eine Bootstrap-Klasse packen, BBCode als Modul laden und Mainpage über einen Controller ansteuern.
Schau dir mal an wie das z.B. mit dem Zend Framework laufen würde: Zend Framework
Mit Zitat antworten
  #9 (permalink)  
Alt 16-07-2009, 01:09
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

werde ich machen zuvor aber noch ne frage... wie übergebe ich jetzt parameter?

z.b. hier:
PHP-Code:
//so war es zuvor
$array['author']    = $user->getnamebyid($row->author);
//und jetzt
$array['author']    = $user->userhandler->getnamebyid=$row->author;
//die function

public function getnamebyid($id)
{
    
$username $db->MysqlDB->querySingleItem("SELECT username FROM user WHERE uid = $id"__FILE____LINE__);

  if (
$db->MysqlDB->querySingleItem("SELECT status FROM user WHERE uid = $id"__FILE____LINE__) != 'activ') {
      
$userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a> (Inaktiv)";
      } else {
      
$userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a>";
      }

return 
$userdata;

als output erhalte ich nicht den usernamen sondern nur die ID sprich $row->author

was mache ich falsch?
Mit Zitat antworten
  #10 (permalink)  
Alt 16-07-2009, 11:44
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

PHP-Code:
$array['author']    = $user->userhandler->getnamebyid=$row->author
Das ist doch totaler Käse. getnamebyid ist eine Funktion und seit wann kann man Funktionen mit = einen Wert zuweisen?
Mit Zitat antworten
  #11 (permalink)  
Alt 16-07-2009, 18:25
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

ja ka hab iwas falsch aufgeschnappt


PHP-Code:
$array['author']    = $user->userhandler->getnamebyid($row->author); 
geht auch net ... Oo
Mit Zitat antworten
  #12 (permalink)  
Alt 16-07-2009, 19:47
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

Sicherlich scheitert es bereits beim Zugriff auf $user->userhandler. Mach mal ein var_dump() davon, dann wirst du es sehen.
Mit Zitat antworten
  #13 (permalink)  
Alt 17-07-2009, 10:26
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

jetzt erstmal kurz ne frage um fehler zu vermeiden:

es reicht ja wenn ich foldene code in den constructor einer class lege
PHP-Code:
  $db    =Registry::getInstance();
  
$temp    =Registry::getInstance();
  
$conf    =Registry::getInstance();
  
$user    =Registry::getInstance();
  
$page    =Registry::getInstance(); 
oder muss ich die insanzen die ich in einer function benötige da ablegen?

den in der MainPage class funktioniert es.... aber wenn ich jetzt das gleiche in die UserHandler class ablege kann ich die getnamebyid function nicht aufrufen...

Code:
Fatal error:  Call to a member function querySingleItem() on a non-object in /home/mpl/workspace/PIP/lib/user/userhandler.class.php on line 136
line 136 ist

PHP-Code:
    $username $db->MysqlDB->querySingleItem("SELECT username FROM user WHERE uid = $id"__FILE____LINE__); 
Mit Zitat antworten
  #14 (permalink)  
Alt 17-07-2009, 15:02
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Ich habe dein Problem nicht wirklich verstanden, aber glaube, dass fehlermeldung davon abhängen könnte:

Registry::getInstance() liefert immer das gleiche statischer Object zurück.
Im klar text sind deine variablen $db, $temp , $conf $user und $page das gleiche Object.
Wenn du jetzt $db->ding='blum' machst und danach $temp->ding='blj', dann wird $db->ding=='blj' sein.
Ich vermute, dass gerade das eine Ursache für ein verlorenen Object sein könnte (Call to a member function ....)

Schafe dir erst mal die Namensräume um Problem zu vermeiden
$db=Registry::getInstance()->db=new DBclassInsantce(..);
jetzt kannst du $db->MysqlDB->..
als auch $db=Registry::getInstance()->db->MysqlDB->..
nutzen.
Hoffentlich habe ich dein Problem richtig verstanden.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #15 (permalink)  
Alt 17-07-2009, 17:05
coty
 Registrierter Benutzer
Links : Onlinestatus : coty ist offline
Registriert seit: Jul 2009
Beiträge: 11
coty befindet sich auf einem aufstrebenden Ast
Standard

ich versuchs mal anhand eines beispieles zu erklären:


index.php

PHP-Code:
<?
require "lib/start.php";

$page->Mainpage->title(Index);
$page->Mainpage->header();

   
$news $db->MysqlDB->queryObjectArray("SELECT * 
                  FROM news 
                  ORDER BY added DESC LIMIT 10
                 "
__FILE____LINE__);

    
$inhalt =    array();

   foreach(
$news as $row) {

       
        
$numcomments  $db->MysqlDB->querysingleitem("SELECT COUNT(*) FROM newscomments where newsid=$row->id"__FILE____LINE__);
      

    
$array['id']         = $row->id;
        
$array['added']      = $row->added;
        
$array['title']      = $bbcode->BBcode->BBCode2Html($row->title);
        
$array['body']       = $bbcode->BBcode->BBCode2Html($row->body);
    
$array['numcomments']    = $numcomments;
    
$array['author']    = $user->UserHandler->getnamebyid($row->author);
        
$inhalt[] = $array;  

            
$temp->Smarty->assign(array(
              
'NEWS_ARR'        =>    $inhalt
                    
));
    }


$temp->Smarty->display('index.tpl');
lib/start.php

PHP-Code:
$workpath $_SERVER["DOCUMENT_ROOT"];
require_once(
"$workpath/lib/registry.php");
require_once(
"$workpath/lib/config/config.class.php");
require_once(
"$workpath/lib/database/mysqldb.class.php");
require_once(
"$workpath/lib/smarty/smarty.class.php");
require_once(
"$workpath/lib/user/userhandler.class.php");
require_once(
"$workpath/lib/mainpage/mainpage.class.php");
require_once(
"$workpath/lib/mainpage/bbcode.class.php");

$conf     Registry::getInstance();
$db     Registry::getInstance();
$temp    Registry::getInstance();
$user    Registry::getInstance();
$page    Registry::getInstance();
$bbcode    Registry::getInstance();

$conf->Config       = new Config();
$db->MysqlDB       = new MysqlDB();
$temp->Smarty       = new Smarty();
$user->UserHandler = new UserHandler();
$page->Mainpage       = new Mainpage();
$bbcode->BBcode       = new BBcode();

$user->UserHandler->start_session(); 
lib/user/userhandler.class.php
PHP-Code:
class UserHandler 
{
//restliche funktionen entfernt
public function getnamebyid($id)
{
    
$username $db->MysqlDB->querySingleItem("SELECT username FROM user WHERE uid =$id"__FILE____LINE__);

  if (
$db->MysqlDB->querySingleItem("SELECT status FROM user WHERE uid =$id"__FILE____LINE__) != 'activ') {
      
$userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a> (death)";
      } else {
      
$userdata "<a href=\"index.php?site=user?id=$id\">".htmlspecialchars($username)."</a>";
      }

return 
$userdata;
}
?> 
lib/mainpage/mainpage.class.php

PHP-Code:
class MainPage {
function 
__construct()
{
  
$db    =Registry::getInstance();
  
$temp    =Registry::getInstance();
  
$conf    =Registry::getInstance();
  
$user    =Registry::getInstance();
  
$page    =Registry::getInstance();
}
public function 
header() 
{
//entfernt
}
public function 
footer() 
{
//etnfernt
}


und wie gesagt wenn ich jetzt die function $user->UserHandler->getnamebyid($row->author); auf der index.php aufrufe erscheint der fehler...
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
Ich will da mal was loswerden.... Milchbolle Out of Order 3 09-06-2003 01:48
GD LIB Warning loswerden schmalle PHP Developer Forum 6 06-03-2003 17:32
anstelle global $a,$b,$c,$d; -> global CONST; joschua PHP Developer Forum 11 24-01-2003 22:26
Global ? crono PHP Developer Forum 2 21-09-2002 21:59
GLOBAL.ASA für PHP cocito PHP Developer Forum 2 23-04-2002 11:35

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 01:24 Uhr.