在同一个类中的受保护函数中定义的访问变量

时间:2016-05-09 15:53:04

标签: php function

您好,

我有这段代码:

class ssi
{
 protected function _example1() {
  $somevar = "hello";
 }

 protected function _example2() {
  $newvar = $somevar;
 }
}

我想从函数example2()中访问$ somevar,但不必这样做:

$newvar = example1();

有可能吗?我尝试使用下面的代码,但没有工作:

$newvar = $this->_example1()->$somevar;

谢谢。

2 个答案:

答案 0 :(得分:2)

你不能,该变量只存在于该函数中(当它是类的一部分时也称为方法)。你需要做的是使它成为一个类属性,然后使用$this关键字从方法中访问它,如下所示:

class ssi
{
 protected $somvar = "hello";
 protected function _example1() {
  $this->somevar .= " world";;
 }

 protected function _example2() {
  $newvar = $this->somevar;
 }
}

答案 1 :(得分:1)

由于scoping rules,这是不可能的。违反的具体规则在手册中以这种方式提及:

  

[W]在用户定义的函数中引入了本地函数作用域。函数内使用的任何变量默认都限制在本地函数范围内。

当函数从被调用返回时,对该局部变量的访问会丢失。这在PHP中同样适用于我所知道的几乎所有语言。

如果您需要数据来自该功能,那么您应该返回

class ssi
{
    protected function _example1() 
    {
        return "hello";
    }

    protected function _example2() 
    {
        $newval = $this->_example1();
    }
}

或者,设置一个可以从其他函数访问的类属性:

class ssi
{
    protected $somevar;
    protected function _example1() 
    {
        $this->somvar = "hello";
    }

    protected function _example2() 
    {
        // Note you still need to actually call the function first
        $this->_example1();
        $newvar = $this->somevar;
    }
}

<强>更新

您可以想象从函数返回的任何内容都将实际函数调用替换为调用该函数的结果。

function adder($n) {
    return $n + 1;
}

$test = adder(5);

在这个例子中,你期望$test等于6(它会)。但是,在调用adder后,参数$n不再可访问,因此任何引用该变量的尝试都将失败。

我认为Styphon在他的评论中提到的是这样的:

function iReturnAnObject() {
    $value = new StdClass;
    $value->somevar = "hello";
    return $value;
}

$test = iReturnAnObject()->somevar;

此代码将起作用,$test将在执行后保留值"hello"