php объектно-ориентированная видимость - PullRequest
5 голосов
/ 08 апреля 2011

Я немного запутался в этом абзаце о видимости OO в PHP.было любопытно, если бы кто-то мог объяснить это мне.примеры были бы БОЛЬШИМИ!мой мозг не мыслит ясно.

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

Первый абзац гласит:

Видимость свойства или метода можно определить, добавив к объявлению префиксключевые слова общедоступные, защищенные или частные.Члены класса, объявленные публичными, могут быть доступны везде. Члены, объявленные защищенными, могут быть доступны только внутри самого класса и унаследованных и родительских классов .Члены, объявленные как закрытые, могут быть доступны только классу, который определяет член.

как родительский класс может получить доступ к члену дочернего класса?

Ответы [ 4 ]

5 голосов
/ 08 апреля 2011

Вот как:

class A {
    public function test() {
        $b = new B;
        echo $b->foo;
    }
}

class B extends A {
    protected $foo = 'bar';
}

$a = new A;
$a->test();
1 голос
/ 09 апреля 2011

общедоступная область: свойство (метод, переменная и т. Д.) Может быть доступно из любого класса в любом файле.

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)

1 голос
/ 08 апреля 2011

PHP является интерпретируемым языком. Свойства разрешаются во время выполнения, а не на этапе компиляции. И модификаторы доступа просто проверяются при обращении к свойству.

Не имеет значения, внедряете ли вы новое (необъявленное) новое свойство, чтобы оно стало общедоступным, или если вы объявляете защищенное свойство в унаследованном классе.

private действительно влияет только на доступность снаружи. Разрешение ->name во время выполнения работает независимо от этого. И среда выполнения PHP просто не работает, если объявление свойства было сделано для текущего класса экземпляров объекта. (В отличие от частных объявлений.)

0 голосов
/ 28 февраля 2019

Защищенный тип 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
   }
}

Там, как вы понимаете, protected isто, что используется в наследовании .

...