Synlighet

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Synlighet

Synligheten för en egenskap, en metod eller (från och med PHP 7.1.0) en konstant kan definieras genom att förklara deklarationen med nyckelorden `public`, `protected` eller `private`. Klassmedlemmar som deklareras som `public` kan nås överallt. Medlemmar som deklareras som `protected` kan endast nås inom klassen själv och av arvande och föräldraklasser. Medlemmar som deklareras som `private` kan endast nås av klassen som definierar medlemmen.

Egenskapssynlighet

Klassens egenskaper kan definieras som `public`, `private`, eller `protected`. Egenskaper som deklareras utan någon explicit synlighetsnyckel definieras som `public`.

Exempel #1 Egenskapsdeklaration

<?php
/**
 * Definiera 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; // Fungerar
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Visar Public, Protected och Private


/**
 * Definiera MyClass2
 */
class MyClass2 extends MyClass
{
    // Vi kan omdeklarera de offentliga och skyddade egenskaperna, men inte de privata
    public $public = 'Public2';
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Fungerar
echo $obj2->protected; // Fatal Error
echo $obj2->private; // Undefined
$obj2->printHello(); // Visar Public2, Protected2, Undefined
?>

Metodsynlighet

Klassens metoder kan definieras som `public`, `private`, eller `protected`. Metoder som deklareras utan någon explicit synlighetsnyckel definieras som `public`.

Exempel #2 Metoddeklaration

<?php
/**
 * Definiera MyClass
 */
class MyClass
{
    // Deklarera en offentlig konstruktor
    public function __construct() { }

    // Deklarera en offentlig metod
    public function MyPublic() { }

    // Deklarera en skyddad metod
    protected function MyProtected() { }

    // Deklarera en privat metod
    private function MyPrivate() { }

    // Detta är offentligt
    function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}

$myclass = new MyClass;
$myclass->MyPublic(); // Fungerar
$myclass->MyProtected(); // Fatal Error
$myclass->MyPrivate(); // Fatal Error
$myclass->Foo(); // Public, Protected och Private fungerar


/**
 * Definiera MyClass2
 */
class MyClass2 extends MyClass
{
    // Detta är offentligt
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // Fatal Error
    }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Fungerar
$myclass2->Foo2(); // Public och Protected fungerar, inte Private

class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate 
                // Foo::testPublic
?>

Konstant Synlighet

Från och med PHP 7.1.0 kan klasskonstanter definieras som `public`, `private`, eller `protected`. Konstanter som deklareras utan någon explicit synlighetsnyckel definieras som `public`.

Exempel #3 Konstantdeklaration från och med PHP 7.1.0

<?php
/**
 * Definiera MyClass
 */
class MyClass
{
    // Deklarera en offentlig konstant
    public const MY_PUBLIC = 'public';

    // Deklarera en skyddad konstant
    protected const MY_PROTECTED = 'protected';

    // Deklarera en privat konstant
    private const MY_PRIVATE = 'private';

    public function foo()
    {
        echo self::MY_PUBLIC;
        echo self::MY_PROTECTED;
        echo self::MY_PRIVATE;
    }
}

$myclass = new MyClass();
MyClass::MY_PUBLIC; // Fungerar
MyClass::MY_PROTECTED; // Fatal Error
MyClass::MY_PRIVATE; // Fatal Error
$myclass->foo(); // Public, Protected och Private fungerar


/**
 * Definiera MyClass2
 */
class MyClass2 extends MyClass
{
    // Detta är offentligt
    function foo2()
    {
        echo self::MY_PUBLIC;
        echo self::MY_PROTECTED;
        echo self::MY_PRIVATE; // Fatal Error
    }
}

$myclass2 = new MyClass2;
echo MyClass2::MY_PUBLIC; // Fungerar
$myclass2->foo2(); // Public och Protected fungerar, inte Private
?>

Synlighet från andra objekt

Objekt av samma typ kommer att ha tillgång till varandras privata och skyddade medlemmar, även om de inte är samma instans. Detta beror på att implementeringsspecifika detaljer redan är kända när man befinner sig inom dessa objekt.

Exempel #4 Åtkomst till privata medlemmar av samma objekttyp

<?php
class Test
{
    private $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    private function bar()
    {
        echo 'Accessed the private method.';
    }

    public function baz(Test $other)
    {
        // Vi kan ändra den privata egenskapen:
        $other->foo = 'hello';
        var_dump($other->foo);

        // Vi kan också anropa den privata metoden:
        $other->bar();
    }
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

Det ovanstående exemplet kommer att producera:

string(5) "hello"
Accessed the private method.

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.oop5.visibility.php
PHP
Språkreferens
Språkreferens#Klasser_och_Objekt