कोड शब्दों से बेहतर बोलती है:सापेक्ष नामस्थान और call_user_func()
namespaces.php:
<?php
namespace foo;
use foo\models;
class factory
{
public static function create($name)
{
/*
* Note 1: FQN works!
* return call_user_func("\\foo\\models\\$name::getInstance");
*
* Note 2: direct instantiation of relative namespaces works!
* return models\test::getInstance();
*/
// Dynamic instantiation of relative namespaces fails: class 'models\test' not found
return call_user_func("models\\$name::getInstance");
}
}
namespace foo\models;
class test
{
public static $instance;
public static function getInstance()
{
if (!self::$instance) {
self::$instance = new self;
}
return self::$instance;
}
public function __construct()
{
var_dump($this);
}
}
namespace_test.php:
<?php
require_once 'namespaces.php';
foo\factory::create('test');
टिप्पणी की के रूप में, अगर मैं call_user_func()
के अंदर पूर्ण-योग्य नाम का उपयोग करें, यह अपेक्षा के अनुसार काम करता है, लेकिन यदि मैं सापेक्ष नेमपैक का उपयोग करता हूं es यह कहता है कि कक्षा – नहीं मिली लेकिन प्रत्यक्ष तत्काल कार्य करता है। क्या मुझे कुछ या उसके अजीब डिज़ाइन से याद आ रहा है?
मेरा मानना है कि यह डिज़ाइन द्वारा है। वही नियम 'परिभाषित()', 'निरंतर()', आदि जैसे कार्यों के लिए लागू होता है। [यह टिप्पणी] देखें (http://www.php.net/manual/en/function.defined.php#110530) । – Passerby