码迷,mamicode.com
首页 > Web开发 > 详细

PHP新手之学习类与对象(3)

时间:2016-04-03 23:49:59      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

四、访问控制

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

1、对类成员的访问控制

类成员都必须使用关键字public、protected 或 private 进行定义

Example#1 声明类成员

<?php
/**
 * Define MyClass
 */
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
/**
 * Define MyClass2
 */
class MyClass2 extends MyClass {
    // 可以对 public 和 protected 进行重定义,但 private 而不能
    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

class Bar {
    public function test() {
        $this -> testPrivate();
        $this -> testPublic();
    } 

    public function testPublic() {
        echo "Bar::testPublic\n";
    } 

    private function testPrivate() {
        echo "Bar::testPrivate\n";
    } 
} 

class Foo extends Bar {
    public function testPublic() {
        echo "Foo::testPublic\n";
    } 

    private function testPrivate() {
        echo "Foo::testPrivate\n";
    } 
} 
$myFoo = new foo();
$myFoo -> test(); // Bar::testPrivate 
// Foo::testPublic
?>

Note: 为了兼容性考虑,在 PHP 4 中使用 var 关键字对变量进行定义的方法在 PHP 5 中仍然有效(只是作为 public 关键字的一个别名)。在 PHP 5.1.3 之前的版本,该语法会产生一个 E_STRICT 警告。

2、对方法的访问控制

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

Example#2 声明类中的方法

<?php
/**
 * Define MyClass
 */
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 都被调用了

/**
 * Define MyClass2
 */
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 不会被调用

?>

 

PHP新手之学习类与对象(3)

标签:

原文地址:http://www.cnblogs.com/qingsong/p/5351107.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!