Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak wywolac? klasa::metod(); gdzie 'klasa' jest wartoscia..
Forum PHP.pl > Forum > PHP
patrycjusz
Jak w temacie a dokładniej...[php:1:1ee277504a]<?php
function MOD($action)
{
include_once MODS.$action.'.php';
action::perform();
}

?>[/php:1:1ee277504a]
Zwraca blad że klasa action nie istnieje i tutaj wlasnie moje pytanie jak w tym przypadku zastosować jakiś "alias" własnie na tą nazwe klasy? bo w przypadku podstawienia zmiennej $action jest oczywiscie parse error a przypadku jak powyzej ze takowej klasy nie ma rolleyes.gif
Z góry dziękuje za pomoc.
Pozdrawiam patS.
Seth
[php:1:a9947f15c6]
function MOD($action)
{
include_once MODS.$action.'.php';
{$action}::perform();
}
[/php:1:a9947f15c6]
patrycjusz
hmm widzisz Seth twoj pomysl wyrzuca mi parse error :wink: ale obszedlem to tak (dla majach ten sam problem) [php:1:524c7a0417]<?php
function MOD($action)
{
include_once MODS.$action.'.php';
$action = & new $action;
$action->perform();
}
?>[/php:1:524c7a0417]
Teraz mam troszeczke inny probelm, do obiektu tego (a dokladnie perform) chcialbym przekazywac z gory jakis okreslony obiekt (nie przez wywolywanie juz w tej klasie odwolujac sie do GLOBAL) a raczej zalezalo by mi na uniwersalnym rozwiazaniu.... ma ktoś jakiś pomysł?
adwol
Metoda 1:
[php:1:ab006235c4]<?php
eval("$action::perform();");
?>[/php:1:ab006235c4]
Metoda 2:
[php:1:ab006235c4]<?php
call_user_func(array($action, 'perform'));
?>[/php:1:ab006235c4]
patrycjusz
Chyba się nie zrozumieliśmy adwol (lub ja niezrozumiałem ciebie),
posiedziałe troche jeszcze.. (ups... 05:41) i jednak pozostałem przy metodzie tej [php:1:647ba82401]<?php
function MOD($action = 'main')
{
parent::base();
include_once MODS.$action.'.php';
$action = & new $action;
$action->perform();
}
//objaśniając funkcja MOD jest wywolywana przez konstruktor jakiejś tam klasy, i funkcja MOD ma za zadanie wywołać odpowiedni plik z odowiednią klasą i jej metode perform() której to wywoływany jest znowu konstruktor klasy base() aby uzyskać w metodzie perform wlasności klasy base - jej konstruktora
?>[/php:1:647ba82401]
i prawie wszystko ok poza kilkoma rzeczami....
:arrow: 1. najdziwniejsze jest to że gdy w metdzie perform się odwołuje do obiektu adodb (inicjowanego w konstruktorze base) jest ok ale np. obiekt smarty również inicjowany w base już w perform nie jest dostepny a w MOD tak (to mnie dręczy nie moiłosiernie :wink: )
:arrow: 2 . czy jest jakiś sposób aby
Cytat
klasa A
konstruktor A
{
wartości inicjowane przez konstruktor klasy A,

wywolanie metody klasy A -> C
}
metoda C
{
->odwolujemy sie do D.  
}
}

klasa B extends A
{
wartosci z konstruktora klasy A,
}

//zaznaczam że nigdzie nie incjujemy B poza konstruktorem A.

Jak znam życie to namotałem ostro, ale albo zaczynam odczuwać pewien dyskomfort w programowaniu w php4 (własnie tutaj kiedy trzba kombinować) albo ... muszę jeszcze poczytać, więc zwracam się do was z prośbą o pomoc... :wink:
DeyV
proponuję zrobić to odrobinę inaczej.
Napisać clase typu CORE, która będzie posiadząc metodę [php:1:977216e9e8]<?php
CORE::&getClass( $strNazwaKlasy );
?>[/php:1:977216e9e8]
Funkcja ta sprawdza, czy w specjalnej tablicy ma już instancje poszukiwanej klasy. Jeśli tak - zwraca referencję do niej.
Jeśli nie - includuje potrzebne pliki, i tworzy instancję klasy w swojej tablicy obiektów.

Przy starcie skryptu jako jedyny obiekt tworzymy (np. w tablicy globalnej) [php:1:977216e9e8]<?php
$GLOBALS['CORE'] = new CORE;
?>[/php:1:977216e9e8]
A w skrypcie odwołujemy się do obiektów poprzez
[php:1:977216e9e8]<?php
$objTest =& $GLOBALS['CORE']->getClass( 'test' );
?>[/php:1:977216e9e8]

Jeśli chcesz przykładowy kod CORE, pisz.
patrycjusz
niom bardzo chętnie bym zobaczył przykładową klase CORE :wink: , sam właśnie siadam w tej chwili i taką klasę będe pisał , albo starał się napisać :wink: , ale zadziwił mnie problem ze smarty i adodb (adodb widzi smart niestety nie). Ale problem wydaje mi się głębszy, mam nadzieje ze w 5 problem zostanie rozwiązany :wink:
DeyV
No to prosze - zauwaz, ze dla adodb przeznaczyłem sobną metodę. Być może dla smarty tez by było warto... smile.gif
Dodatkowo chciałem zauważyć, ze zawsze w CORE dołaczam 2 klasy c_error i c_info - które nie są oczywisćie konieczne do poprawnego działania. smile.gif

[php:1:8d154cdda7]<?php
/**
* 03-12-07 by DeyV
*/
class core{

function core( $arrParm='' ) { $this->__construct( &$arrParm ); }

var $arrDir = array(
'class' => 'core/class/' ,
'mods' => 'core/mods/' ,

);

var $arrMods = array();
var $arrClass = array();

var $objError, $objInfo ;


function __construct( $arrParm ='' )
{
if( !empty( $arrParm['dirClass'] ) ) {
$this->arrDir['class'] = $arrParm['dirClass'] ;
}
if( !empty( $arrParm['dirMods'] ) ) {
$this->arrDir['mods'] = $arrParm['dirMods'] ;
}


require_once $this->arrDir['class'] . "c_error.php";
$this->objError = new c_error;

require_once $this->arrDir['class'] . "c_info.php";
$this->objInfo = new c_info;

}

function isSetMod( $strName='', $strPrefix='' )
{
return( isset($this->arrMods[ $strPrefix . $strName ] ) );
}


function &getMod( $strName='', $strPrefix='' )
{
if( empty( $strName ) )
{
return FALSE;
}

if( $this->isSetMod( $strName , $strPrefix ) )
{
return( $this->arrMods[ $strPrefix . $strName ] );

}elseif( class_exists( $strName ) )
{
$this->arrMods[ $strPrefix . $strName] = new $strName;
return( $this->arrMods[ $strPrefix . $strName] );

}elseif( file_exists ( $this->arrDir['mods'] . $strName . '.mod.php' ) )
{
include_once( $this->arrDir['mods'] . $strName . '.mod.php' );
if( class_exists( $strName ) )
{
$this->arrMods[$strPrefix . $strName] = new $strName;
return( $this->arrMods[ $strPrefix . $strName] );
} else
{
return FALSE;
}
}else
{
trigger_error('bład: nie mozna zaladowac moda <b>'. $strName . '</b> ('. $this->arrDir['mods'] . $strName . '.mod.php)' );
return FALSE;
}
}



function &getADoDB( )
{
if( empty( $this->arrClass['ADoDB'] ) )
{
require_once('../lib/adodb/adodb.inc.php');


$this->arrClass['ADoDB'] =& ADONewConnection( $GLOBALS['dbtyp'] );
$this->arrClass['ADoDB'] -> debug = $GLOBALS['dbdebug'];

if( false === $this->arrClass['ADoDB'] ->
Connect( $GLOBALS['dbhost'], $GLOBALS['dbuser'], $GLOBALS['dbhaslo'], $GLOBALS['dbname'] ) )
{
$this->objError->dodaj("Bł&plusmn;d startu","Brak połaczenia z baz&plusmn; danych");
return false;
}
}
return $this->arrClass['ADoDB'] ;
}
}

?>[/php:1:8d154cdda7]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.