[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/


<<:  Day 3 - Vue的专案结构

>>:  铁人赛 Day18-- 继续我们的登入者介面吧

[ Day 11 ] React 的生命周期 - Mounting

在 Class Component 的章节中我们提到过,它有别於 Function Compone...

Swift 新手-如何使用 Xcode 建立专案?

Xcode 版本 12.5 介面 点选 ios app 建立专案范本,范本有内建预设程序码,协助快速...

教练,我想自干作业系统!

前言 写一个 OS 是多麽美好的事,在有限的生命中千万不要遗漏了它。 -- 王佑中博士 笔者在开始撰...

Windows Web Form(C#) import Web API

Windows Web Form(C#) import Web API     步骤一 :先新增或使...

LeetCode解题 Day01

565. Array Nesting https://leetcode.com/problems/a...