好吧,我想知道他们如何将应用程序类用作数组
例如在应用程序文件
中供应商/ laravel /框架/ SRC /照亮/容器/ Application.php
在魔术方法__set和__get中,他们使用$ this作为数组
这是代码
/**
* Dynamically access container services.
*
* @param string $key
* @return mixed
*/
public function __get($key)
{
return $this[$key];
}
/**
* Dynamically set container services.
*
* @param string $key
* @param mixed $value
* @return void
*/
public function __set($key, $value)
{
$this[$key] = $value;
}
但是,如果没有任何错误,我不明白这是如何工作的
我尝试了类似的东西,但它给了我以下错误
这是我的代码
class Container{
public function __get($key){
return $this[$key];
}
public function __set($key,$val){
$this[$key] = $val;
}
}
$app = new Container();
$app->test = 'ok';
echo $app->test;
致命错误:无法在第10行的C:\ xampp \ htdocs \ test \ test.php中使用Container类型的对象
对此有何解释?
顺便说一句,我使用的是laravel v4.2.12
答案 0 :(得分:3)
Laravel的Illuminate\Container\Container
类实现了PHP的ArrayAccess接口,它为类提供了数组访问语法。要实现此界面,您必须为offsetExists()
,offsetGet()
,offsetSet()
和offsetUnset()
方法提供实施。一旦您的类正确实现了ArrayAccess接口,您就可以使用数组访问语法。
这只是ArrayAccess实现的一个示例,但您可以尝试这样的事情:
// note the implementation
class Container implements ArrayAccess {
protected $data = array();
public function offsetExists($offset) {
return array_key_exists($offset, $this->data);
}
public function offsetGet($offset) {
return $this->data[$offset];
}
public function offsetSet($offset, $value) {
$this->data[$offset] = $value;
}
public function offsetUnset($offset) {
unset($this->data[$offset]);
}
public function __get($key) {
return $this[$key];
}
public function __set($key, $val) {
$this[$key] = $val;
}
}
$app = new Container();
$app->test = 'ok';
echo $app->test.PHP_EOL.PHP_EOL.print_r($app, true);
您还可以查看Illuminate\Container\Container
实现,了解Laravel实际上是如何实现的。