2010-05-19 14 views
6

तो मैं दो वर्गों इस तरह है:पीएचपी पहुँच वर्ग

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

मैं सभी तरीकों बार के अंदर foo के तरीकों इस तरह, बार के अंदर प्रत्येक विधि में यह घोषित करने के बिना, का उपयोग करना चाहते हैं:

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

मैं इसे विस्तारित नहीं करना चाहता हूं। मैंने var कीवर्ड का उपयोग करने का प्रयास किया, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा था। बार के सभी तरीकों के अंदर अन्य वर्ग "foo" तक पहुंचने के लिए मैं क्या करूँ?

उत्तर

7

आप यह भी तरह कर सकता है:

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. */ 
} 

बाद में आप कर सकता है:

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

इसे पैरामीटर के रूप में पास करने के बारे में कभी सोचा नहीं; यह अब काम करता है। धन्यवाद! –

+0

@arxanas: आपका स्वागत है :) – Sarfraz

+3

एफवाईआई, जिसे निर्भरता इंजेक्शन –

4

इसे बार का सदस्य बनाएं। ग्लोबल्स का कभी भी उपयोग करने की कोशिश न करें।

class bar { 
    private $foo; 

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

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

संक्षिप्त उत्तर: नहीं, वहाँ आप क्या चाहते हैं लागू करने के लिए कोई रास्ता नहीं है।

एक और संक्षिप्त उत्तर: आप कक्षाओं के साथ "गलत" तरीके से काम कर रहे हैं। एक बार ऑब्जेक्ट ओरिएंटेड प्रतिमान का चयन करने के बाद - "वैश्विक" कीवर्ड के बारे में भूल जाएं।

foo का उदाहरण bar के सदस्य के रूप में बनाना और इसके तरीकों का उपयोग करना है। इसे delegation कहा जाता है।

0

एक विकल्प है अपनी कक्षाओं को स्वत: लोड करना। इसके अलावा, अगर आप अपने वर्ग एक स्थिर वर्ग बनाने के लिए, आप इसे $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(); 
    } 
} 

आप एक स्थिर वर्ग

//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

में और यदि आपके वर्ग (foo) में परिवर्तित यदि आपका ही ध्यान केंद्रित है अन्य वर्गों के उदाहरण के विपरीत स्वयं विधियों, आप 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(); 
संबंधित मुद्दे