php 類屬性

類的變量成員叫作屬性,屬性聲明是由關鍵字Public,Protected,Private作開頭,而後跟一個普通的變量聲明來組成,屬性中的變量能夠初始化,可是初始化的值必須是常數。php

若是直接使用var聲明屬性,而沒有用public,protected 或者private,php將會視爲public.函數

在類的成員方法裏面,能夠用->(對象運算符)好比$this->property(property是屬性名)這種方式 來訪問非靜態數據。this

靜態屬性則使用::(雙冒號)self::$property來訪問spa

舉個例子 調用類的成員方法code

<?php

  class SimpleClass{

         public $name="Tome";

         //若不聲明public 則默認是public

          $name="Tome";

         

   }

   //實例化對象訪問屬性用->

  $simple=new SimpleClass();

  $simple->name;

?>

PHP 對屬性或方法的訪問控制,是經過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。對象

public(公有):公有的類成員能夠在任何地方被訪問。blog

protected(受保護):受保護的類成員則能夠被其自身以及其子類和父類訪問。io

private(私有):私有的類成員則只能被其定義所在的類訪問。function

類屬性必須定義爲公有,受保護,私有之一。若是用 var 定義,則被視爲公有。class

<?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

?>

方法的訪問控制

類中的方法能夠被定義爲公有,私有或受保護。若是沒有設置這些關鍵字,則該方法默認爲公有。

<?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\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
?>
相關文章
相關標籤/搜索