【发布时间】:2017-02-02 17:15:12
【问题描述】:
好的,在访问一个类中的几个其他类时,我经常遇到一些未解决的错误。
根据首先需要哪个类,它不会使其在其他文件的 __construct 函数中可访问。
Undefined property: Container::$Core in /usr/share/nginx/html/app/classes/class.users.php on line 9
class.container.php
public function __construct() {
if(isset(self::$class)) {
foreach(self::$class as $key => $value) {
if(!isset($this->{$key})) {
$this->{$key} = $value;
}
}
}
}
public function setClassHandlers($class = []) {
if(!isset(self::$class)) {
foreach($class as $name => $file) {
$file = DIR . "app/classes/" . $file;
if(!isset(self::$library[$name])) {
// Get interface file
$interface = DIR . "app/classes/interfaces/interface.".strtolower($name).".php";
// Check if interface file exists
if(!file_exists($interface)) {
// Throw exception
$this->throwException("Unable to load interface file: {$interface}");
}
// Require interface
require_once $interface;
//Check if interface is set
if(!interface_exists("i".ucfirst($name))) {
// Throw exception
$this->throwException("Unable to find interface: {$interface}");
}
// Check if class file exists
if(!file_exists($file)) {
// Throw exception
$this->throwException("Unable to load class file: {$file}");
}
// Require class
require_once $file;
// Check if class file exists
if(class_exists($name)) {
// Set Library
self::$library[$name] = $file;
// Set interface
self::$interface[$name] = $interface;
// Set class // class.container.php
self::$class[$name] = new $name(new self);
$this->{$name} = self::$class[$name];
} else {
// Thror error
$this->throwException("Unable to load class: {$name}", self::$library[$name]);
}
}
}
}
}
在index.php上的函数中插入参数:
require_once DIR . 'app/management/dependency.php';
$container = new Container();
$container->setClassHandlers([
// Name // Path
'Database' => 'class.database.php',
'Config' => 'class.config.php',
'Users' => 'class.users.php',
'Core' => 'class.core.php',
//'Admin' => 'class.admin.php',
//'Forum' => 'class.forum.php',
//'Template' => 'class.template.php'
]);
class.users.php
public function __construct(Container $class) {
$this->db = $class->Database;
$this->core = $class->Core;
$this->ip = $this->core->userIP();
$this->container = $class;
}
例如 Users 和 Core 在彼此的同一个文件中使用,但如上所述,如果首先需要 Core, Users 不是该类中的可用依赖项。
我不太确定如何解决此问题,因此感谢您的每一个帮助。
【问题讨论】:
-
你知道这是错的吗?还是你的问题是错字?
$file = DIR . "app/classes/" . $file;应该是__DIR__ -
@yivi 在“DIR”被定义为
dirname(__FILE__) . DIRECTORY_SEPARATOR时并不是一个错字,但它和__DIR__有什么区别? -
__DIR__是魔术常数,类似于__FILE__。始终指向当前文件所在的目录。为清楚起见,不建议使用DIR。使用WEBROOT或更明确的东西,IMO。原生__DIR__不包含斜杠。 -
你是善意的重新发明轮子,但我很害怕。有什么理由不想使用现有的容器,比如Pimple,既简单又轻量级?
-
@yivi 我宁愿自己学习也不愿使用别人的工作。
标签: php oop dependency-injection