首页WEB开发PHP教程 → php基础知识:类与对象(4) 访问控制

php基础知识:类与对象(4) 访问控制

日期:2007-6-7 10:58:00 出处:其他转载 作者:郭浩泽 人气:

访问控制的实现:
    在前面添加关键字 public、protected 或 private 来实现的。由 public 所定义的类成员可以在任何地方被访问;由 protected 所定义的类成员则可以被其所在类的子类和父类访问(当然,该成员所在的类也可以访问);而由 private 定义的类成员则只能被其所在类访问。

对类成员的访问控制
    类成员都必须使用关键字public、protected 或 private 进行定义
    PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 的面向对象语法中不再使用。为了顾及兼容性,在类中定义一个变量的话,该变量会被自动设为 public,并且产生一个 E_STRICT 警告。


例子:
class MyClass
{
   public $public = 'Public';
   protected $protected = 'Protected';
   private $private = 'Private';

   function printHello()
   {
       echo $this->public;
       echo $this->protected;
       echo $this->private;
   }
}

$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private

class MyClass2 extends MyClass
{
   // 可以对 public 和 protected 进行重定义,但 private 而不能(???不明白???1)
   protected $protected = 'Protected2';
   function printHello()
   {
       echo $this->public;
       echo $this->protected;
       echo $this->private;
   }
}
$obj2 = new MyClass2();
echo $obj->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2,但不会输出 Private

对类方法的访问控制:
    类中的方法都必须使用关键字public、protected 或 private 进行定义。如果没有设置这些关键字,则该方法会被设置成默认的 public。

例子:
class MyClass
{
   // 构造函数必须是 public
   public function __construct() { }
   // 声明一个 public 的方法
   public function MyPublic() { }
   // 声明一个 protected 的方法
   protected function MyProtected() { }
   // 声明一个 private 的方法
   private function MyPrivate() { }
   // 这个方法也是 public 的
   function Foo()
   {
       $this->MyPublic();
       $this->MyProtected();
       $this->MyPrivate();
   }
}

$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // Public、Protected 和 Private 都被调用了

class MyClass2 extends MyClass
{
   // This is public
   function Foo2()
   {
       $this->MyPublic();
       $this->MyProtected();
       $this->MyPrivate(); //这行会产生一个致命错误
   }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); //这行能被正常执行
$myclass2->Foo2(); //Public 和 Protected 都被调用了,但 Private 不会被调用


??私有成员不允许重定义,那么私有方法允许重定义吗?这是个问题,需要通过实验来确认。
不允许重定义的原因又是什么???
另外应该注意好好体会protected的用法。

关于本站 | 帮 助 | 广告服务 | 版权声明 | 业务合作 | 捐助本站 | 软件发布 | 联系我们
77资源下载 www.77zy.com ©2007-2008 版权所有
备案编号:赣ICP备07002641号  QQ:674648476