dongnan
总版主
总版主
  • 粉丝52
  • 发帖数2165
  • 铜币13236枚
  • 威望5838点
  • 银元150个
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
阅读:891回复:0

php 类中 static 静态关键字示例

楼主#
更多 发布于:2017-03-22 09:53
错误信息
php smsChannel.php
PHP Fatal error:  Using $this when not in object context in /home/dongnan/git/traffic/_CUSTOM_CLASS/smsChannel.php on line 246

错误原因
$this 引用没有上下文
在PHP5中,static 声明的静态方法里,不能使用 $this 需要使用 self 来引用当前类中的方法或属性。

代码
class Sms implements SmsEntry {

    // 调用 curlPost 方法
    public static function balance() {
        
        //查询参数
        $postArr = array(
            'un' => self::SMS_USERID,
            'pw' => self::SMS_PASSWD,
        );

        $result = $this->curlPost(self::SMS_URL, $postArr);  // 注意这里 $this
        return $result;
        
    }  

    // 被调用的静态方法;
    public static function curlPost($url, $postFields) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    // XXX 省略.
}

解决方法

将 $this 替换为 self ,修改如下:
class Sms implements SmsEntry {

    // 调用 curlPost 方法
    public static function balance() {
        
        //查询参数
        $postArr = array(
            'un' => self::SMS_USERID,
            'pw' => self::SMS_PASSWD,
        );

        $result = self::curlPost(self::SMS_URL, $postArr);  // 注意这里 self::
        return $result;
        
    }
    
    // XXX 省略.
}

扩展: php class 中的Static(静态)关键字

使用 static 关键字,来定义静态"方法"和"属性"。声明类"属性"或"方法"为静态,就可以不实例化类而直接访问
静态"属性"不能通过一个类已实例化的对象来访问,但静态"方法"可以。

由于静态"方法"不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。静态属性不可以由对象通过 -> 操作符来访问,(使用self::)。

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

参考
http://blog.csdn.net/yageeart/article/details/6662059
http://php.net/manual/zh/language.oop5.static.php
#
游客

返回顶部