zoukankan      html  css  js  c++  java
  • PHP新手之学习类与对象(3)

    四、访问控制

    对属性或方法的访问控制,是通过在前面添加关键字 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
    ";
        } 
    
        private function testPrivate() {
            echo "Bar::testPrivate
    ";
        } 
    } 
    
    class Foo extends Bar {
        public function testPublic() {
            echo "Foo::testPublic
    ";
        } 
    
        private function testPrivate() {
            echo "Foo::testPrivate
    ";
        } 
    } 
    $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 不会被调用
    
    ?>
  • 相关阅读:
    C语言笔记
    js学习笔记
    Javascript学习笔记
    Java基础知识
    使用 StackExchange.Redis 封装属于自己的 RedisHelper
    StackExchange.Redis 使用资料
    .NET平台下Redis使用(三)【ServiceStack.Redis学习】
    .NET平台下Redis使用(二)【StackExchange.Redis学习】
    Redis 详解 (一) StackExchange.Redis Client
    .NET中使用Redis
  • 原文地址:https://www.cnblogs.com/qingsong/p/5351107.html
Copyright © 2011-2022 走看看