【问题标题】:php object oriented visibilityphp面向对象的可见性
【发布时间】:2011-08-01 04:04:20
【问题描述】:

我对关于 PHP 中的 OO 可见性的这一段有点困惑。很好奇是否有人可以向我解释。例子会很棒!我的大脑思维不清晰。

http://www.php.net/manual/en/language.oop5.visibility.php

第一段内容

属性或方法的可见性 可以通过前缀定义 带有关键字 public 的声明, 受保护的或私有的。班级成员 声明的公共可以访问 到处。 成员声明受保护 只能在类内访问 本身以及通过继承和父母 类。声明为私有的成员 只能由该类访问 定义成员。

父类如何访问子类成员?

【问题讨论】:

    标签: php oop programming-languages


    【解决方案1】:

    Protected 是 visibility 的一种类型,它使声明为 protected 的属性和方法在声明类的子类中可用。

    class Parent {
        public $name = 'MyName';
        protected $age = 20;
        private $school = 'MySchool';
    }
    class Child extends Parent {
       public function __construct() {
           echo $this -> name; // valid as public
           echo $this -> age; // valid as protected
           echo $this -> school; // invalid as private
       }
    }
    

    你知道protectedinheritance中使用的东西。

    【讨论】:

      【解决方案2】:

      公共范围:可以从任何文件中的任何类访问属性(方法、变量等)。

      class Example {
          public $foo;
      }
      
      $example = new Example;
      $example->foo = 3; // everything OK
      

      私有范围:属性只能被同一个类访问。

      class Example {
          private $foo;
      }
      
      class Child_Class extends Example {
      
          public function some_method()
          {
              parent::foo = 3; // raises error
          }
      }
      

      受保护范围:属性只能由同一类或扩展它的其他类访问。​​

      class Example {
          protected $foo;
      }
      
      class Child_Class extends Example {
      
          public function some_method()
          {
              parent::foo = 3; // this is OK
          }
      }
      

      这一切都与一种名为封装的技术有关,在这种技术中,您不得允许在类之外更改类成员的状态或行为。 http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

      【讨论】:

        【解决方案3】:

        PHP 是一种解释型语言。属性在运行时解析,而不是在编译阶段。访问修饰符只是在访问属性时检查。

        如果您临时注入一个新的(未声明的)属性使其变为公共的,或者如果您在继承的类中声明一个受保护的属性,则没有区别。

        private 实际上只影响外部的可访问性。无论如何,->name 在运行时解析都有效。如果属性声明是为当前对象实例类进行的,PHP 运行时根本不支持。 (与私有声明不同。)

        【讨论】:

          【解决方案4】:

          就是这样:

          class A {
              public function test() {
                  $b = new B;
                  echo $b->foo;
              }
          }
          
          class B extends A {
              protected $foo = 'bar';
          }
          
          $a = new A;
          $a->test();
          

          【讨论】:

          • 看起来很不对劲。难怪 PHP 总是被丑陋的棍子涂上;-)
          • @Phil 是的,是否推荐这种模式是另一回事...... ;-)
          • 这也适用于从静态函数访问属性时。
          猜你喜欢
          • 2017-12-29
          • 2016-12-23
          • 2011-02-23
          • 2014-08-25
          • 2012-03-11
          • 2010-12-26
          • 2021-02-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多