iT邦幫忙

2021 iThome 鐵人賽

DAY 17
1
自我挑戰組

後端新手PHP+Laravel筆記系列 第 17

[Day17] static靜態方法

static靜態方法

範圍解析操作符(::)

php可以利用這一對冒號來訪問靜態成員,類常量,還可以用於覆蓋類中的屬性和方法

在類的外部使用 :: 操作符
<?php
class MyClass {
    const CONST_VALUE = 'A constant value';
}

$classname = 'MyClass';
echo $classname::CONST_VALUE; // 自 PHP 5.3.0 起

echo MyClass::CONST_VALUE;
?>

self,parent 和 static 這三個特殊的關鍵字是用於在類定義的內部對其屬性或方法進行訪問的。

在類定義內部使用 ::
<?php
class OtherClass extends MyClass
{
    public static $my_static = 'static var';

    public static function doubleColon() {
        echo parent::CONST_VALUE . "\n";
        echo self::$my_static . "\n";
    }
}

$classname = 'OtherClass';
echo $classname::doubleColon(); // 自 PHP 5.3.0 起

OtherClass::doubleColon();
?>

當一個子類覆蓋其父類中的方法時,PHP 不會調用父類中已被覆蓋的方法。是否調用父類的方法取決於子類。這種機制也作用於構造函數和析構函數,重載以及魔術方法。

調用父類的方法
<?php
class MyClass
{
    protected function myFunc() {
        echo "MyClass::myFunc()\n";
    }
}

class OtherClass extends MyClass
{
    // 覆蓋了父類定義
    public function myFunc()
    {
        // 但還是可以調用父類中被覆盖的方法
        parent::myFunc();
        echo "OtherClass::myFunc()\n";
    }
}

$class = new OtherClass();
$class->myFunc();
?>

靜態(static)關鍵字

聲明類屬性或方法為靜態,就可以不實例化類而直接訪問。靜態屬性不能通過一個類已實例化的對象來訪問(但靜態方法可以)

靜態方法

靜態方法示例
<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();
?>

靜態屬性

靜態屬性不可以由對象通過 -> 操作符來訪問。 就像其它所有的 PHP 靜態變量一樣,靜態屬性在初始化時遵循和 const 表達式一樣的規則: 有一些特定的表達式是可行的,取決於它們是否能在編譯時就計算出值。 通過變量來引用一個類是可行的,但這個變量的值不能是一個保留字 (例如self,parent和 static)

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // 未定義的 "屬性" my_static

print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n";

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>

資料來源: https://www.php.net/


上一篇
[Day16] 類別(Class) - private, protected, public
下一篇
[Day18] 抽象類別
系列文
後端新手PHP+Laravel筆記30

尚未有邦友留言

立即登入留言