gpt4 book ai didi

php - 变量为空,直到重新分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:49 26 4
gpt4 key购买 nike

我不太确定为什么会发生这种情况,或者如何正确解释它,但也许有人可以阐明这一点。

我有一个基于 CodeIgniter/Opencart 框架的 CMS 系统,它使用注册表、 Controller 和模块。我遇到了一个场景,我之前将一个变量保存到注册表中:

$this->application_page = 'current/page';

但由于某些原因,当我在应用程序中调用它时:

echo empty($this->application_page)?'yes':'no';
//Returns Yes

但是..当我重新分配它时:

echo empty($this->application_page)?'yes':'no';
//Returns Yes

$page = $this->application_page;
echo empty($page)?'yes':'no';
//Returns No

var_dump 返回:

var_dump($this->application_page);
string 'current/page' (length=12)

我可以通过使用 $page 轻松解决这个问题,但我很想知道为什么会这样?

更新:

所以我弄乱了 _isset 函数,但没有让它工作,可能是我的错误,也可能不是。这是它们如何协同工作的:

class Registry {
private $data = array();
public function get($key){ return (isset($this->data[$key]) ? $this->data[$key] : NULL); }
public function set($key,$val){ $this->data[$key] = $val;
}

abstract class Controller {
protected $registry;
public function __construct($registry){ $this->registry = $registry; }
public function __get($key){ return $this->registry->get($key); }
public function __set($key,$value){ $this->registry->set($key, $value); }
}

class Applications {
private $registry;
function __construct($Registry){ $this->registry = $Registry; }
function __get($key){ return $this->registry->get($key); }
function __set($key,$val){ return $this->registry->set($key,$val); }
public function buildApplication(){
$this->application_page = 'current/page';
$application = new application($this->registry);
}

}

class Application extends Controller {
public function index(){
echo empty($this->application_page)?'yes':'no';
//Returns Yes

$page = $this->application_page;
echo empty($page)?'yes':'no';
//Returns No
}
}

希望这有帮助?有一个错字,Registry 的功能不是魔术方法。在应用程序中也声明了 $registry。

最佳答案

该类可能没有实现魔法 __isset()通过调用 isset() 触发的方法或 empty()关于不可访问的属性。


例子:

Live demo I :

<?php

class Test {
private $a = '42';

public function __get($name) {
return $this->a;
}
}

$obj = new Test();
var_dump($obj->a); // string(2) "42"
var_dump(empty($obj->a)); // bool(true)

实现__isset()如下方法 ( Live demo II ) 将产生正确的结果:

public function __isset($name) {
if ($name == 'a') {
return true;
}
return false;
}

// ...
var_dump($obj->a); // string(2) "42"
var_dump(empty($obj->a)); // bool(false)


这是实现 __isset() 的新代码版本方法: http://ideone.com/rJekJV

更改日志:

  • 向内部调用 Registry::has()Controller 类添加了 __isset() 方法。
  • Registy 类添加了 has() 方法。

  • [仅用于测试:对象初始化和运行 Application::index() 方法。]

有一个问题(更新您的答案后):

  • 您还没有将 $registry 声明为 Applications 类中的成员变量。
    否则代码会失败,因为它没有访问实际的成员变量(神奇的 __set() 方法!)

  • 此外,您的代码中有相当多的冗余(不是 DRY)。我希望这不是生产代码;)

关于php - 变量为空,直到重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18074005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com