Extends: PHP 类中的继承

看一个简单的例子:

http://hi.baidu.com/shirdrn/blog/item/f5f635454ec9d920cffca3fd.html

如有一个EpiOAuth类:

ContractedBlock.gif ExpandedBlockStart.gif Code
<?php
class EpiOAuth
{
  
public $version = '1.0';

  
protected $requestTokenUrl;
  
protected $accessTokenUrl;
  
protected $authorizeUrl;
  
protected $consumerKey;
  
protected $consumerSecret;
  
protected $token;
  
protected $tokenSecret;
  
protected $signatureMethod;

  
public function getAccessToken()
  {
    
$resp = $this->httpRequest('GET', $this->accessTokenUrl);
    
return new EpiOAuthResponse($resp);
  }

  
public function getAuthorizationUrl()
  { 
    
$retval = "{$this->authorizeUrl}?";

    
$token = $this->getRequestToken();
    
return $this->authorizeUrl . '?oauth_token=' . $token->oauth_token;
  }

  
public function getRequestToken()
  {
    
$resp = $this->httpRequest('GET', $this->requestTokenUrl);
    
return new EpiOAuthResponse($resp);
  }

  
public function httpRequest($method = null, $url = null, $params = null)
  {
    
if(empty($method|| empty($url))
      
return false;

    
if(empty($params['oauth_signature']))
      
$params = $this->prepareParameters($method, $url, $params);

    
switch($method)
    {
      
case 'GET':
        
return $this->httpGet($url, $params);
        
break;
      
case 'POST':
        
return $this->httpPost($url, $params);
        
break;
    }
  }

  
public function setToken($token = null, $secret = null)
  {
    
$params = func_get_args();
    
$this->token = $token;
    
$this->tokenSecret = $secret;
  } 

  
public function encode($string)
  {
    
return rawurlencode(utf8_encode($string));
  }

  
protected function addOAuthHeaders(&$ch, $url, $oauthHeaders)
  {
    
$_h = array('Expect:');
    
$urlParts = parse_url($url);
    
$oauth = 'Authorization: OAuth realm="' . $urlParts['path'. '",';
    
foreach($oauthHeaders as $name => $value)
    {
      
$oauth .= "{$name}=\"{$value}\",";
    }
    
$_h[] = substr($oauth, 0, -1);
  
    curl_setopt(
$ch, CURLOPT_HTTPHEADER, $_h); 
  }

  
protected function generateNonce()
  {
    
if(isset($this->nonce)) // for unit testing
      return $this->nonce;

    
return md5(uniqid(rand(), true));
  }

  
protected function generateSignature($method = null, $url = null, $params = null)
  {
    
if(empty($method|| empty($url))
      
return false;


    
// concatenating
    $concatenatedParams = '';
    
foreach($params as $k => $v)
    {
      
$v = $this->encode($v);
      
$concatenatedParams .= "{$k}={$v}&";
    }
    
$concatenatedParams = $this->encode(substr($concatenatedParams, 0, -1));

    
// normalize url
    $normalizedUrl = $this->encode($this->normalizeUrl($url));
    
$method = $this->encode($method); // don't need this but why not?

    
$signatureBaseString = "{$method}&{$normalizedUrl}&{$concatenatedParams}";
    
return $this->signString($signatureBaseString);
  }

  
protected function httpGet($url, $params = null)
  {
    
if(count($params['request']) > 0)
    {
      
$url .= '?';
      
foreach($params['request'as $k => $v)
      {
        
$url .= "{$k}={$v}&";
      }
      
$url = substr($url, 0, -1);
    }
    
$ch = curl_init($url);
    
$this->addOAuthHeaders($ch, $url, $params['oauth']);
    curl_setopt(
$ch, CURLOPT_RETURNTRANSFER, true);
    
$resp  = $this->curl->addCurl($ch);

    
return $resp;
  }

  
protected function httpPost($url, $params = null)
  {
    
$ch = curl_init($url);
    
$this->addOAuthHeaders($ch, $url, $params['oauth']);
    curl_setopt(
$ch, CURLOPT_POST, 1);
    curl_setopt(
$ch, CURLOPT_POSTFIELDS, http_build_query($params['request']));
    curl_setopt(
$ch, CURLOPT_RETURNTRANSFER, true);
    
$resp  = $this->curl->addCurl($ch);
    
return $resp;
  }

  
protected function normalizeUrl($url = null)
  {
    
$urlParts = parse_url($url);
    
$scheme = strtolower($urlParts['scheme']);
    
$host   = strtolower($urlParts['host']);
    
$port = intval($urlParts['port']);

    
$retval = "{$scheme}://{$host}";
    
if($port > 0 && ($scheme === 'http' && $port !== 80|| ($scheme === 'https' && $port !== 443))
    {
      
$retval .= ":{$port}";
    }
    
$retval .= $urlParts['path'];
    
if(!empty($urlParts['query']))
    {
      
$retval .= "?{$urlParts['query']}";
    }

    
return $retval;
  }

  
protected function prepareParameters($method = null, $url = null, $params = null)
  {
    
if(empty($method|| empty($url))
      
return false;

    
$oauth['oauth_consumer_key'= $this->consumerKey;
    
$oauth['oauth_token'= $this->token;
    
$oauth['oauth_nonce'= $this->generateNonce();
    
$oauth['oauth_timestamp'= !isset($this->timestamp) ? time() : $this->timestamp; // for unit test
    $oauth['oauth_signature_method'= $this->signatureMethod;
    
$oauth['oauth_version'= $this->version;

    
// encoding
    array_walk($oauth, array($this, 'encode'));
    
if(is_array($params))
      
array_walk($params, array($this, 'encode'));
    
$encodedParams = array_merge($oauth, (array)$params);

    
// sorting
    ksort($encodedParams);

    
// signing
    $oauth['oauth_signature'= $this->encode($this->generateSignature($method, $url, $encodedParams));
    
return array('request' => $params, 'oauth' => $oauth);
  }

  
protected function signString($string = null)
  {
    
$retval = false;
    
switch($this->signatureMethod)
    {
      
case 'HMAC-SHA1':
        
$key = $this->encode($this->consumerSecret) . '&' . $this->encode($this->tokenSecret);
        
$retval = base64_encode(hash_hmac('sha1', $string, $key, true));
        
break;
    }

    
return $retval;
  }

  
public function __construct($consumerKey, $consumerSecret, $signatureMethod='HMAC-SHA1')
  {
    
$this->consumerKey = $consumerKey;
    
$this->consumerSecret = $consumerSecret;
    
$this->signatureMethod = $signatureMethod;
    
$this->curl = EpiCurl::getInstance();
  }
}

class EpiOAuthResponse
{
  
private $__resp;

  
public function __construct($resp)
  {
    
$this->__resp = $resp;
  }

  
public function __get($name)
  {
    
if($this->__resp->code < 200 || $this->__resp->code > 299)
      
return false;

    
parse_str($this->__resp->data, $result);
    
foreach($result as $k => $v)
    {
      
$this->$k = $v;
    }

    
return $result[$name];
  }
}

 

另有一个EpiTwitter类,继承EpiOAuth类:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<?php
class EpiTwitter extends EpiOAuth
{
  
const EPITWITTER_SIGNATURE_METHOD = 'HMAC-SHA1';
  
protected $requestTokenUrl = 'http://twitter.com/oauth/request_token';
  
protected $accessTokenUrl = 'http://twitter.com/oauth/access_token';
  
protected $authorizeUrl = 'http://twitter.com/oauth/authorize';
  
protected $apiUrl = 'http://twitter.com';

  
public function __call($name, $params = null)
  {
    
$parts  = explode('_', $name);
    
$method = strtoupper(array_shift($parts));
    
$parts  = implode('_', $parts);
    
$url    = $this->apiUrl . '/' . preg_replace('/[A-Z]|[0-9]+/e', "'/'.strtolower('\\0')", $parts. '.json';
    
if(!empty($params))
      
$args = array_shift($params);

    
return new EpiTwitterJson(call_user_func(array($this, 'httpRequest'), $method, $url, $args));
  }

  
public function __construct($consumerKey = null, $consumerSecret = null, $oauthToken = null, $oauthTokenSecret = null)
  {
    parent
::__construct($consumerKey, $consumerSecret, self::EPITWITTER_SIGNATURE_METHOD);
    
$this->setToken($oauthToken, $oauthTokenSecret);
  }
}

class EpiTwitterJson
{
  
private $resp;

  
public function __construct($resp)
  {
    
$this->resp = $resp;
  }

  
public function __get($name)
  {
    
$this->responseText = $this->resp->data;
    
$this->response = (array)json_decode($this->responseText, 1);
    
foreach($this->response as $k => $v)
    {
      
$this->$k = $v;
    }

    
return $this->$name;
  }
}

 

 在EpiTwitter类中该方法使用parent关键字调用了基类的display()方法,调用基类方法使用操作符“::”


<?php
class EpiOAuth
{
  
public $version = '1.0';

  
protected $requestTokenUrl;
  
protected $accessTokenUrl;
  
protected $authorizeUrl;
  
protected $consumerKey;
  
protected $consumerSecret;
  
protected $token;
  
protected $tokenSecret;
  
protected $signatureMethod;

  
public function getAccessToken()
  {
    
$resp = $this->httpRequest('GET', $this->accessTokenUrl);
    
return new EpiOAuthResponse($resp);
  }

  
public function getAuthorizationUrl()
  { 
    
$retval = "{$this->authorizeUrl}?";

    
$token = $this->getRequestToken();
    
return $this->authorizeUrl . '?oauth_token=' . $token->oauth_token;
  }

  
public function getRequestToken()
  {
    
$resp = $this->httpRequest('GET', $this->requestTokenUrl);
    
return new EpiOAuthResponse($resp);
  }

  
public function httpRequest($method = null, $url = null, $params = null)
  {
    
if(empty($method|| empty($url))
      
return false;

    
if(empty($params['oauth_signature']))
      
$params = $this->prepareParameters($method, $url, $params);

    
switch($method)
    {
      
case 'GET':
        
return $this->httpGet($url, $params);
        
break;
      
case 'POST':
        
return $this->httpPost($url, $params);
        
break;
    }
  }

  
public function setToken($token = null, $secret = null)
  {
    
$params = func_get_args();
    
$this->token = $token;
    
$this->tokenSecret = $secret;
  } 

  
public function encode($string)
  {
    
return rawurlencode(utf8_encode($string));
  }

  
protected function addOAuthHeaders(&$ch, $url, $oauthHeaders)
  {
    
$_h = array('Expect:');
    
$urlParts = parse_url($url);
    
$oauth = 'Authorization: OAuth realm="' . $urlParts['path'. '",';
    
foreach($oauthHeaders as $name => $value)
    {
      
$oauth .= "{$name}=\"{$value}\",";
    }
    
$_h[] = substr($oauth, 0, -1);
  
    curl_setopt(
$ch, CURLOPT_HTTPHEADER, $_h); 
  }

  
protected function generateNonce()
  {
    
if(isset($this->nonce)) // for unit testing
      return $this->nonce;

    
return md5(uniqid(rand(), true));
  }

  
protected function generateSignature($method = null, $url = null, $params = null)
  {
    
if(empty($method|| empty($url))
      
return false;


    
// concatenating
    $concatenatedParams = '';
    
foreach($params as $k => $v)
    {
      
$v = $this->encode($v);
      
$concatenatedParams .= "{$k}={$v}&";
    }
    
$concatenatedParams = $this->encode(substr($concatenatedParams, 0, -1));

    
// normalize url
    $normalizedUrl = $this->encode($this->normalizeUrl($url));
    
$method = $this->encode($method); // don't need this but why not?

    
$signatureBaseString = "{$method}&{$normalizedUrl}&{$concatenatedParams}";
    
return $this->signString($signatureBaseString);
  }

  
protected function httpGet($url, $params = null)
  {
    
if(count($params['request']) > 0)
    {
      
$url .= '?';
      
foreach($params['request'as $k => $v)
      {
        
$url .= "{$k}={$v}&";
      }
      
$url = substr($url, 0, -1);
    }
    
$ch = curl_init($url);
    
$this->addOAuthHeaders($ch, $url, $params['oauth']);
    curl_setopt(
$ch, CURLOPT_RETURNTRANSFER, true);
    
$resp  = $this->curl->addCurl($ch);

    
return $resp;
  }

  
protected function httpPost($url, $params = null)
  {
    
$ch = curl_init($url);
    
$this->addOAuthHeaders($ch, $url, $params['oauth']);
    curl_setopt(
$ch, CURLOPT_POST, 1);
    curl_setopt(
$ch, CURLOPT_POSTFIELDS, http_build_query($params['request']));
    curl_setopt(
$ch, CURLOPT_RETURNTRANSFER, true);
    
$resp  = $this->curl->addCurl($ch);
    
return $resp;
  }

  
protected function normalizeUrl($url = null)
  {
    
$urlParts = parse_url($url);
    
$scheme = strtolower($urlParts['scheme']);
    
$host   = strtolower($urlParts['host']);
    
$port = intval($urlParts['port']);

    
$retval = "{$scheme}://{$host}";
    
if($port > 0 && ($scheme === 'http' && $port !== 80|| ($scheme === 'https' && $port !== 443))
    {
      
$retval .= ":{$port}";
    }
    
$retval .= $urlParts['path'];
    
if(!empty($urlParts['query']))
    {
      
$retval .= "?{$urlParts['query']}";
    }

    
return $retval;
  }

  
protected function prepareParameters($method = null, $url = null, $params = null)
  {
    
if(empty($method|| empty($url))
      
return false;

    
$oauth['oauth_consumer_key'= $this->consumerKey;
    
$oauth['oauth_token'= $this->token;
    
$oauth['oauth_nonce'= $this->generateNonce();
    
$oauth['oauth_timestamp'= !isset($this->timestamp) ? time() : $this->timestamp; // for unit test
    $oauth['oauth_signature_method'= $this->signatureMethod;
    
$oauth['oauth_version'= $this->version;

    
// encoding
    array_walk($oauth, array($this, 'encode'));
    
if(is_array($params))
      
array_walk($params, array($this, 'encode'));
    
$encodedParams = array_merge($oauth, (array)$params);

    
// sorting
    ksort($encodedParams);

    
// signing
    $oauth['oauth_signature'= $this->encode($this->generateSignature($method, $url, $encodedParams));
    
return array('request' => $params, 'oauth' => $oauth);
  }

  
protected function signString($string = null)
  {
    
$retval = false;
    
switch($this->signatureMethod)
    {
      
case 'HMAC-SHA1':
        
$key = $this->encode($this->consumerSecret) . '&' . $this->encode($this->tokenSecret);
        
$retval = base64_encode(hash_hmac('sha1', $string, $key, true));
        
break;
    }

    
return $retval;
  }

  
public function __construct($consumerKey, $consumerSecret, $signatureMethod='HMAC-SHA1')
  {
    
$this->consumerKey = $consumerKey;
    
$this->consumerSecret = $consumerSecret;
    
$this->signatureMethod = $signatureMethod;
    
$this->curl = EpiCurl::getInstance();
  }
}

class EpiOAuthResponse
{
  
private $__resp;

  
public function __construct($resp)
  {
    
$this->__resp = $resp;
  }

  
public function __get($name)
  {
    
if($this->__resp->code < 200 || $this->__resp->code > 299)
      
return false;

    
parse_str($this->__resp->data, $result);
    
foreach($result as $k => $v)
    {
      
$this->$k = $v;
    }

    
return $result[$name];
  }
}

 

转载于:https://www.cnblogs.com/jinrize/archive/2009/10/27/1590670.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值