2010-05-19 15 views
6

Więc mam dwie klasy tak:PHP klasa dostęp wewnątrz innej klasy

class foo { 
    /* code here */ 
} 
$foo = new foo(); 
class bar { 
    global $foo; 
    public function bar() { 
     echo $foo->something(); 
    } 
} 

chcę przejść do metody foo wewnątrz wszystkich barów sposobami, bez deklarowania go w każdej metodzie wewnątrz baru, tak:

class bar { 
    public function bar() { 
     global $foo; 
     echo $foo->something(); 
    } 
    public function barMethod() { 
     global $foo; 
     echo $foo->somethingElse(); 
    } 
    /* etc */ 
} 

Nie chcę tego również przedłużać. Próbowałem użyć słowa kluczowego var, ale wydawało się, że nie działa. Co mam zrobić, aby uzyskać dostęp do drugiej klasy "foo" we wszystkich metodach paska?

Odpowiedz

7

Można zrobić tak też:

class bar { 
    private $foo = null; 

    function __construct($foo_instance) { 
     $this->foo = $foo_instance; 
    } 

    public function bar() { 
     echo $this->foo->something(); 
    } 
    public function barMethod() { 
     echo $this->foo->somethingElse(); 
    } 
    /* etc, etc. */ 
} 

Później można zrobić:

$foo = new foo(); 
$bar = new bar($foo); 
+0

Nigdy nie myślałem o przekazaniu go jako parametru; Teraz działa. Dzięki! –

+0

@arxanas: Serdecznie zapraszamy :) – Sarfraz

+3

FYI, znany jako Dependency Injection –

4

Spraw, aby był członkiem zespołu. Staraj się nigdy nie używać globali.

class bar { 
    private $foo; 

    public function __construct($foo) { $this->foo = $foo; } 

    public function barMethod() { 
     echo $this->foo->something(); 
    } 
} 
2

Krótka odpowiedź: Nie, nie ma sposobu, aby realizować to, co chcesz.

Kolejna krótka odpowiedź: pracujesz z zajęciami w "niewłaściwy" sposób. Po wybraniu paradygmatu zorientowanego na obiekt - zapomnij o "globalnym" słowie kluczowym.

Właściwy sposób robienia tego, co chcesz, to utworzenie instancji foo jako członka bar i użycie jej metod. Nazywa się to delegation.

0

Opcja polega na automatycznym dodawaniu zajęć. Ponadto, jeśli dokonać Klasa A Klasa statyczna, można nazwać bez $classname = new classname():

//Autoloader 
spl_autoload_register(function ($class) { 
$classDir = '/_class/'; 
$classExt = '.php'; 
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; 
}); 

//Your code 
class bar { 
    private static $foo = null; //to store the class instance 

    public function __construct(){ 
     self::$foo = new foo(); //stores an instance of Foo into the class' property 
    } 

    public function bar() { 
     echo self::$foo->something(); 
    } 
} 

Jeśli zamienić klasę (foo) w statycznej klasie

//Autoloader 
spl_autoload_register(function ($class) { 
$classDir = '/_class/'; 
$classExt = '.php'; 
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; 
}); 

//Your code 
    class bar { 
     public function bar() { 
      echo foo::something(); 
     } 
    } 
1

A jeśli jedynym celem jest same metody w przeciwieństwie do instancji innej klasy, można użyć x extends y.

class foo { 
    function fooMethod(){ 
    echo 'i am foo'; 
    } 
} 

class bar extends foo { 
    function barMethod(){ 
    echo 'i am bar'; 
    } 
} 

$instance = new bar; 
$instance->fooMethod(); 
Powiązane problemy