PHP中self和this的用法区别

PHP支持类和面向对象结构,PHP的类的静态函数和变量不与任何特定类的实例相关联(换句话说,一个对象)。

相反,静态函数和变量与类定义本身相关联。换言之,一个类的所有实例都共享相同的静态变量。在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self::,在一个类的对象(实例)的上下文中使用其他方法和变量时用this

比较表

 selfthis
能在静态函数里使用
可访问的类变量和方法由self::$this-> (注意:PHP > 5.3 允许由 $this 使用静态变量,用 $this::$foo。 $this->foo 将仍然没有被定义,如果 $foo 是一个静态变量.)
需要一个实例对象

PHP中self和this的实例

    class exampleClass
    {
        public static $foo;
        public $bar;
        public function regularFunction() { echo $this->bar; }
        public static function staticFunction() { echo self::$foo; }
        public static function anotherStatFn() { self::staticFunction(); }
        public function regularFnUsingStaticVar() { echo self::$foo; }
        
        // 注: PHP 5.3 使用 $this::$bar 代替 self::$bar 是允许的
    }
    exampleClass::$foo = "Hello";
    $obj = new exampleClass();
    $obj->bar = "World!";
    exampleClass::staticFunction(); /* 打印 Hello */
    $obj->regularFunction(); /* 打印 World! */

静态函数只能使用静态变量,静态函数和变量的引用是通过 self::函数名() 和 self::变量名。上述实例中,静态变量的引用是由类名(exampleClass::$foo),或者 self:: (self::$foo),当在这个类的静态方法[ 称为 静态函数()]里使用时。类的正则函数和变量需要一个对象上下文来引用,他们不能脱离对象上下文而存在。对象上下文由 $this 提供。在上述函数中,$bar 是一个正则变量,所以它被 $obj->bar(上下文使用变量 obj) 来引用,或者使用 $this->bar(再次在一个对象的方法里在一个对象上下文中) 来引用。

self 不使用前面的 $,因为 self 不意味着是一个变量而是类结构本身。而 $this 引用一个特定的变量,所以有前面的 $ 。

参考:静态关键词

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。

就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 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";      // Undefined "Property" my_static
    print $foo::$my_static . "\n";
    $classname = 'Foo';
    print $classname::$my_static . "\n"; // As of PHP 5.3.0
    print Bar::$my_static . "\n";
    $bar = new Bar();
    print $bar->fooStatic() . "\n";
    ?>
       </programlisting>
      </example>
      <example>
       <title>静态方法示例</title>
        <programlisting role="php">
    <![CDATA[
    <?php
    class Foo {
        public static function aStaticMethod() {
            // ...
        }
    }
    Foo::aStaticMethod();
    $classname = 'Foo';
    $classname::aStaticMethod(); // 自 PHP 5.3.0 起
    ?>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值