Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Zugriffskontrolle: öffentlich/geschützt/privat

PHP-Zugriffskontrolle: öffentlich/geschützt/privat

伊谢尔伦
伊谢尔伦Original
2016-11-23 14:16:421180Durchsuche

Die Zugriffskontrolle von Attributen oder Methoden wird durch das voranstellen der Schlüsselwörter public, protected oder private erreicht. Auf Klassenmitglieder, die als öffentlich definiert sind, kann von überall aus zugegriffen werden. Auf ein als geschützt definiertes Klassenmitglied kann von ihm selbst und seinen Unterklassen und übergeordneten Klassen zugegriffen werden. Als privat definierte Klassenmitglieder können nur von der Klasse aufgerufen werden, in der sie definiert sind.

1. Attributzugriffskontrolle

Klassenattribute müssen als öffentlich, geschützt oder privat definiert werden. Wenn es mit var definiert ist, gilt es als öffentlich.
Beispiel #1 Eigenschaftsdeklaration

class MyClass
{ 
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';
    function printHello()
    {
        echo $this->public.&#39;<br>&#39;;
        echo $this->protected.&#39;<br>&#39;;
        echo $this->private.&#39;<br>&#39;;
    }
}
$obj = new MyClass();
echo $obj->public; //这行可以正常运行
echo $obj->protected; //这行会产生一个致命错误
echo $obj->private; //这行也会产生一个致命错误
$obj->printHello(); //正常输出public、protected、private的值
class MyClass2 extends MyClass
{
    protected $protected = &#39;Protected2&#39;;
    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、Protected和Undefined

Hinweis: Aus Kompatibilitätsgründen ist die Methode der Verwendung des Schlüsselworts var zum Definieren von Variablen in PHP 4 in PHP 5 weiterhin gültig (genau wie ein öffentliches Schlüsselwort und ein Alias). ). In Versionen vor PHP 5.1.3 erzeugte diese Syntax eine E_STRICT-Warnung.

Methodenzugriffskontrolle

Methoden in einer Klasse können als öffentlich, privat oder geschützt definiert werden. Wenn diese Schlüsselwörter nicht festgelegt sind, ist die Methode standardmäßig öffentlich.
Beispiel #2 Methodendeklaration

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(); //公有,受保护,私有都可以执行
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<br>";
    }
    private function testPrivate(){
       echo "Bar::testPrivate<br>";
    }
}
class Foo extends Bar
{
    public function testPublic(){
        echo "Foo::testPublic<br>";
    }
    public function testPrivate(){
       echo "Foo::testPrivate<br>";
    }
}
$myFoo = new Foo();
$myFoo -> test(); //Bar::testPrivate
//Foo::testPublic

Zugriffskontrolle anderer Objekte

Objekte derselben Klasse können auf die privaten und geschützten Mitglieder der anderen Klasse zugreifen, auch wenn sie nicht dieselbe Instanz sind. Dies liegt daran, dass die internen Implementierungsdetails dieser Objekte bekannt sind.
Beispiel #3 Zugriff auf private Mitglieder desselben Objekttyps

class Test
{
    private $foo;
    public function __construct($foo)
    {
        $this->foo = $foo;
    }
    private function bar()
    {
        echo "Accessed the private method."; 
    }
    public function baz(Test $other)
    {
        //我们可以在这里改变私有属性的值
        $other->foo = &#39;hello&#39;;
        var_dump($this->foo);
        //我们也可以在这里调用私有的方法
        $other->bar();
    }
}
$test = new Test(&#39;test&#39;);
$test -> baz(new Test(&#39;other&#39;));

Ausgabeergebnis:

string(4) "test"
Zugriff auf die private Methode.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn