在下面的例子中使用selfstatic有什么区别?

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "\n";
        echo static::$bar;
    }

}

Foo::instance();

生产

1234
1234

推荐答案

当你用self来指代一个类成员时,你指的是你在其中使用关键字的类.在本例中,Foo类定义了一个名为$bar的受保护静态属性.当您在Foo类中使用self来引用属性时,您引用的是同一个类.

因此,如果您试图在Foo类中的其他地方使用self::$bar,但您的Bar类具有不同的属性值,那么它将使用Foo::$bar而不是Bar::$bar,这可能不是您想要的:

class Foo
{
    protected static $bar = 1234;
}

class Bar extends Foo
{
    protected static $bar = 4321;
}

当您通过static创建一个方法时,您正在调用一个名为late static bindings的特性(在PHP5.3中引入).

在上述场景中,使用self将得到Foo::$bar(1234).

// self
var_dump(Foo::$bar);
// (int) 1234

// static
var_dump(Bar::$bar);
// (int) 4321

您通常对方法甚至类本身使用后期静态绑定,而不是属性,因为您不经常在子类中重新声明属性;使用static关键字调用后期绑定构造函数的示例可以在这个相关问题中找到:New self vs. new static

然而,这并不排除在属性中使用static.

Php相关问答推荐

PHP邮件表单无法识别重音/特殊字符

Symfony Api平台:按自定义实体方式排序结果

Laravel 10 -扩展现有的artisan命令?

Laravel eloquent-如果没有包含InitialValue的结果,则查询where Second Value

WooCommerce我的帐户:从帖子作者处获取自定义帖子类型帖子ID

为什么在我的PHP联系人脚本中开机自检后出现未定义变量错误?

FlySystem v3:使用本地适配器时出现问题

以编程方式同步 WPML 翻译更改 Woocommerce 产品销售价格

Font Awesome 加载图标未显示在 WooCommerce 管理员列表中

在 WooCommerce 中应用优惠券时显示购物车商品折扣金额

标签打印机的 CSS

从插件更改主题功能,function_exists 不起作用

根据WooCommerce中的产品重量更改简单产品的输入数量步值

在WooCommerce可变产品中显示所选变体的自定义字段

仅在管理员新订单通知中显示WooCommerce订单商品自定义元数据

设置GA4 PHP API的setSubject以允许访问所有管理员账户属性

Shopware 6.4.20店铺激活问题

Shopware 6:无法在新的自定义插件中保存关联字段(媒体)

PHP for each 函数打印 td

使用 PHP ImageMagick 库将 pdf 文件的前 n 页转换为单个 png 图像文件