一尘不染

我什么时候应该使用 'self' 而不是 '$this'?

php

self在 PHP 5 中,什么时候应该使用 ‘self’ 而不是 ‘$this’?


阅读 175

收藏
2022-02-11

共1个答案

一尘不染

简答

$this引用当前对象。self引用当前类。换句话说, $this->member用于非静态成员,self::$member用于静态成员。

完整答案

下面是一个正确使用$thisself用于非静态和静态成员变量的示例:

<?php
class X {
    private $non_static_member = 1;
    private static $static_member = 2;

    function __construct() {
        echo $this->non_static_member . ' '
           . self::$static_member;
    }
}

new X();
?>

以下是非静态和静态成员变量的不正确用法示例:$this``self

<?php
class X {
    private $non_static_member = 1;
    private static $static_member = 2;

    function __construct() {
        echo self::$non_static_member . ' '
           . $this->static_member;
    }
}

new X();
?>

下面是一个带有for 成员函数的多态性示例:$this

<?php
class X {
    function foo() {
        echo 'X::foo()';
    }

    function bar() {
        $this->foo();
    }
}

class Y extends X {
    function foo() {
        echo 'Y::foo()';
    }
}

$x = new Y();
$x->bar();
?>

下面是一个使用for 成员函数来抑制多态行为的例子:self

<?php
class X {
    function foo() {
        echo 'X::foo()';
    }

    function bar() {
        self::foo();
    }
}

class Y extends X {
    function foo() {
        echo 'Y::foo()';
    }
}

$x = new Y();
$x->bar();
?>

这个想法是$this->foo()调用foo()当前对象的确切类型的成员函数。如果对象是 of type X,它会调用X::foo(). 如果对象是 of type Y,则调用Y::foo(). 但是 self::foo()X::foo()总是被调用。

2022-02-11