zoukankan      html  css  js  c++  java
  • php 访问控制可见性 public protected private

    对属性或方法的访问控制,是通过在前面添加关键字public(公有),protected(受保护的),private(私有)来实现.

    被定义为公有的类成员可以在任何地方被访问.

    被定义为受保护的类成员则被其自身以及其子类和父类访问.

    被定义为私有的类成员则只能被其定义所在类访问

    属性的访问控制

    类属性必须定义为公有,受保护,私有之一.如果用var,则被视为公有.

    <?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 $obj2->public; // 这行能被正常执行
    echo $obj2->private; // 未定义 private
    echo $obj2->protected; // 这行会产生一个致命错误
    $obj2->printHello(); // 输出 Public、Protected2 和 Undefined
    
    ?>

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

    方法的访问控制

    类中的方法可以被定义为公有,私有或受保护.如果没有设置这些关键字,则该方法默认为公有

    <?php
    /**
     * Define MyClass
     */
    class MyClass
    {
        // 声明一个公有的构造函数
        public function __construct() { }
    
        // 声明一个公有的方法
        public function MyPublic() { }
    
        // 声明一个受保护的方法
        protected function MyProtected() { }
    
        // 声明一个私有的方法
        private function MyPrivate() { }
    
        // 此方法为公有
        function Foo()
        {
            $this->MyPublic();
            $this->MyProtected();
            $this->MyPrivate();
        }
    }
    
    $myclass = new MyClass;
    $myclass->MyPublic(); // 这行能被正常执行
    $myclass->MyProtected(); // 这行会产生一个致命错误
    $myclass->MyPrivate(); // 这行会产生一个致命错误
    $myclass->Foo(); // 公有,受保护,私有都可以执行
    
    
    /**
     * Define MyClass2
     */
    class MyClass2 extends MyClass
    {
        // 此方法为公有
        function Foo2()
        {
            $this->MyPublic();
            $this->MyProtected();
            $this->MyPrivate(); // 这行会产生一个致命错误
        }
    }
    
    $myclass2 = new MyClass2;
    $myclass2->MyPublic(); // 这行能被正常执行
    $myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
    
    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
    ?>
  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/objects/p/8981346.html
Copyright © 2011-2022 走看看