12
回答
PHP类中$this指向问题求解?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
class OAuthSignatureMethod { 
    public function check_signature(&$request, $consumer, $token, $signature) { 
        $built = $this->build_signature($request, $consumer, $token); 
        return $built == $signature; 
    } 
}

我想知道build_signature这个方法是哪里来的?$this不是指向本类中的属性或方法么?这个类中没有build_signature这个函数啊?

注:本段代码摘自新浪开放平台SDK。

这个是完整代码,这个类在weibooauth.php中。http://pan.baidu.com/share/link?shareid=1039399277&uk=1597330868


举报
兰月臣
发帖于4年前 12回/1K+阅
共有12个答案 最后回答: 4年前

这个类实际应该写成一个abstract更加合适。

fcitx有时候真实作死。。 '按照'这两个字就能把它搞死。

/** 
 * @ignore 
 */ 
abstract class OAuthSignatureMethod { 
    public function check_signature(&$request, $consumer, $token, $signature) { 
        $built = $this->build_signature($request, $consumer, $token); 
        return $built == $signature; 
    } 

    abstract public function build_signature ($request, $consumer, $token); 
}
--- 共有 3 条评论 ---
兰月臣说的有道理,但不完全针对这个问题,这个问题见我的博客,不过这个回答也算到点上了 4年前 回复
包菜兄就是新浪的开发人员懒,没写abstract,实际这个类是不能单独实例化的。 4年前 回复
兰月臣你的意思是要把这个类改成这样?但是源代码是sina官方的,运行也是可以通过的,我就是想知道那么写是什么情况? 4年前 回复
看看有没有包含的文件
--- 共有 1 条评论 ---
兰月臣没有啊,关键他定义了这么一个类,就这么点内容,就算包含其他文件了,这个类中也不能用$this调用其他类中的方法啊? 4年前 回复

OAuthSignatureMethod::check_signature

估计是这样被调用了, 然后$this就是指向调用它的那个类...

--- 共有 1 条评论 ---
兰月臣没有,倒是有个类继承了这个类,并定义了这个方法。这样$this不就指向了子类的方法?能这样用? 4年前 回复

这个貌似不能直接实例化,需要有其他类继承,微博的PHP_SDK很操蛋的。。。

玩玩还行,真要集成的化最好仿照流程重写一遍

楼上 都没看代码么...明显调用的 是子类中的方法...

class OAuthSignatureMethod { 
    public function check_signature(&$request, $consumer, $token, $signature) { 
        $built = $this->build_signature($request, $consumer, $token); 
        return $built == $signature; 
    } 
} 

/** 
 * @ignore 
 */ 
class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod { 
    function get_name() { 
        return "HMAC-SHA1"; 
    } 

    public function build_signature($request, $consumer, $token) { 
        $base_string = $request->get_signature_base_string(); 

		//print_r( $base_string );
        $request->base_string = $base_string; 

        $key_parts = array( 
            $consumer->secret, 
            ($token) ? $token->secret : "" 
        ); 

        //print_r( $key_parts );
		$key_parts = OAuthUtil::urlencode_rfc3986($key_parts); 
        

		$key = implode('&', $key_parts); 

        return base64_encode(hash_hmac('sha1', $base_string, $key, true)); 
    } 
}
下面的 OAuthSignatureMethod_HMAC_SHA1 类继承了 OAuthSignatureMethod

并定义了 build_signature 方法....

--- 共有 5 条评论 ---
Raynor1呵呵呵呵。这一个正解啊。 4年前 回复
兰月臣貌似明白点了 4年前 回复
酒逍遥回复 @兰月臣 : 由于OAuthSignatureMethod_HMAC_SHA1类继承了OAuthSignatureMetho.那么$this 此时指向的对象里就同时包含了check_signature(父类的方法)和check_signature(子类的方法).此时你再调用对象的check_signature方法,就不会有任何问题了 4年前 回复
酒逍遥回复 @兰月臣 : 类和实例化之后的对象是不同的. $this 本身其实是指向实例化之后的对象. 如果你直接实例化OAuthSignatureMethod 类然后调用check_signature ,肯定会报错.因为此时$this 指向的对象里并不包含build_signature方法.但是如果你实例化OAuthSignatureMethod_HMAC_SHA1,情况就完全不同了 4年前 回复
兰月臣对,我想知道,PHP里$this可以这么用么?感觉跟$this的用法不太相符啊 4年前 回复
php 有个魔术方法,叫__call, 在调用一个不存在的方法时被激活,一些框架为了通用性,往往重写__call方法来实现一些特殊的效果。
--- 共有 1 条评论 ---
兰月臣额。。。听不懂,太高深了 4年前 回复
顶部