private var 在类 php 中不能按预期工作

Posted

技术标签:

【中文标题】private var 在类 php 中不能按预期工作【英文标题】:private var does not work as expected in a class php 【发布时间】:2012-01-17 07:29:06 【问题描述】:

在下面的示例中,我收到一条错误消息,指出 $foo->_test 的值不可访问,因为它是私有的。我做错了什么?

<?php
$foo = new Bar;
$foo->test();
print_r( $foo->_test );

class Foo

    private $_test = array();



class Bar extends Foo

    public function test()
    
        $this->_test = 'opa';
    

?>

感谢任何帮助。

【问题讨论】:

如果我回答了您的问题,请接受。如果没有,请提出一些问题。谢谢。 【参考方案1】:

私有变量只对声明它们的直接类可见。您正在寻找的是protected 没有这个,您实际上是在您的对象中创建了两个不同的成员变量。

class Foo

    protected $_test = array();


class Bar extends Foo

    public function test()
    
        $this->_test = 'opa';
    

[编辑] 您还尝试完全访问类外部的私有(即将受到保护)成员变量。这将始终被禁止。除了在这种情况下,您正在创建第二个 public 成员变量,这就是没有显示错误的原因。您没有提到您希望看到错误,所以我假设这是您的问题。

[编辑]

这里是 var 转储:

object(Bar)#1 (2) 
  ["_test:private"]=>
  array(0) 
  
  ["_test"]=>
  string(3) "opa"

[编辑]

我在自己编写的框架中所做的一件事是创建一个基类,我几乎可以在任何地方进行扩展。这个类所做的一件事是使用 __get__set 方法来强制声明类成员变量 - 它有助于缩小代码问题,例如您遇到的问题。

<?

abstract class tgsfBase

    public function __get( $name )
    
        throw new Exception( 'Undefined class member "' . $name . "\"\nYou must declare all variables you'll be using in the class definition." );
    
    //------------------------------------------------------------------------
    public function __set( $name, $value )
    
        throw new Exception( 'SET: Undeclared class variable ' . $name . "\nYou must declare all variables you'll be using in the class definition." );
    



class Foo extends tgsfBase

    private $_test = array();


class Bar extends Foo

    public function test()
    
        $this->_test = 'opa';
    


header( 'content-type:text/plain');

$foo = new Bar;
$foo->test();
var_dump( $foo );
print_r( $foo->_test );

【讨论】:

这将显示错误Uncaught exception 'Exception' with message 'SET: Undeclared class variable _test【参考方案2】:

私有成员在其子类中不是visible。欲了解更多信息,请阅读Manaul。添加 var_dump() 验证对象结构。

<?php
  $foo = new Bar;
  $foo->teste();
  print_r( $foo->_testando );
  var_dump( $foo);

  class Foo
  
    private $_testando = array();
   
 class Bar extends Foo
  
  public function teste()
   
   $this->_testando  = 'opa';  // a new member of string type will be created 
   
 
?>

【讨论】:

如果复制此代码,保存到 php 文件并运行,查看变量的输出,就好像它是公开的一样。我想知道为什么会发生这个错误。 @user1068478 - 如果成员可见,那么您必须更正声明 - 更正应为:$this-&gt;_testando[] = 'opa';【参考方案3】:

当您将var_dump($foo); 写在$foo-&gt;teste(); 下方时,您将获得完整的想法。

这里 PHP 创建了 2 个名为 _testando 的变量,一个是私有的,具有 value = array(),一个是公共的,具有 value = opa。

这样写:

private $_testando_new = '';

在公共函数teste()之上

并将$this-&gt;_testando = 'opa'; 替换为$this-&gt;_testando_new = 'opa';

并尝试在类外访问 _testando_new 变量,你会得到错误。

再见。

【讨论】:

以上是关于private var 在类 php 中不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

PHP5中public, private, protected 三种类属性的区别

使用eval导出变量不能按预期工作

php 关键字 public private protect final static const

6.7-1php类相关

php 类 属性和方法的关系

类与对象