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->_testando[] = 'opa';
【参考方案3】:
当您将var_dump($foo);
写在$foo->teste();
下方时,您将获得完整的想法。
这里 PHP 创建了 2 个名为 _testando 的变量,一个是私有的,具有 value = array(),一个是公共的,具有 value = opa。
这样写:
private $_testando_new = '';
在公共函数teste()之上
并将$this->_testando = 'opa';
替换为$this->_testando_new = 'opa';
并尝试在类外访问 _testando_new 变量,你会得到错误。
再见。
【讨论】:
以上是关于private var 在类 php 中不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
PHP5中public, private, protected 三种类属性的区别