PHP类中$this指向问题求解?

兰月臣 发布于 2013/09/12 21:44
阅读 2K+
收藏 2
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


加载中
0
包菜兄
包菜兄

这个类实际应该写成一个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); 
}
兰月臣
兰月臣
说的有道理,但不完全针对这个问题,这个问题见我的博客,不过这个回答也算到点上了
包菜兄
包菜兄
就是新浪的开发人员懒,没写abstract,实际这个类是不能单独实例化的。
兰月臣
兰月臣
你的意思是要把这个类改成这样?但是源代码是sina官方的,运行也是可以通过的,我就是想知道那么写是什么情况?
0
开源中国首席保安
开源中国首席保安
看看有没有包含的文件
兰月臣
兰月臣
没有啊,关键他定义了这么一个类,就这么点内容,就算包含其他文件了,这个类中也不能用$this调用其他类中的方法啊?
0
Tuesday
Tuesday

OAuthSignatureMethod::check_signature

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

兰月臣
兰月臣
没有,倒是有个类继承了这个类,并定义了这个方法。这样$this不就指向了子类的方法?能这样用?
0
开源中国董事会主席
开源中国董事会主席
你上面发的是一个类的完整代码?
兰月臣
兰月臣
什么意思?
包菜兄
包菜兄
回复 @兰月臣 : 亲, 你能搞个代码仓库么?
兰月臣
兰月臣
是!我一会把完整代码发出来
包菜兄
包菜兄
回复 @兰月臣 : 到底是不是呢。。。
兰月臣
兰月臣
不是,但这个类就这么多。
0
非师范
var_dump($this);出来就知道是啥了啊。。
兰月臣
兰月臣
貌似的确是啊。。。当时没想到呢。。。今晚回去试试
0
pantrick
pantrick

你整理的代码肯定不完整!

¥this 再这里应该指向本类实例的

兰月臣
兰月臣
这个类是完整的,完整代码也提供了。
0
荆棘谷-部落-我要么
荆棘谷-部落-我要么

var_dump($this);出来就知道是啥了啊。。

同这个

兰月臣
兰月臣
同感谢
0
狂飙的小蜗牛
狂飙的小蜗牛

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

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

0
酒逍遥
酒逍遥

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

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 方法....

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