php中面向对象的问题

时间:2010-05-27 10:21:53

标签: php oop class-design

我在尝试写一些课时遇到了问题, 这是一个例子:     我有这个名为TwitterGrub的课程,我不能这样称呼它:

$c = new TwitterGrub();

$c->twitterDisplay();

这是班级本身:

<?php
class TwitterGrub{


function twitterCapture($user = 'username',$password = 'pass') {  


           $ch = curl_init("https://twitter.com/statuses/user_timeline.xml");  
           curl_setopt($ch, CURLOPT_HEADER, 1);  
           curl_setopt($ch,CURLOPT_TIMEOUT, 30);  
           curl_setopt($ch,CURLOPT_USERPWD,$user . ":" . $password);  
           curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
           curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);  
           curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);  
           $result=curl_exec ($ch);  
           $data = strstr($result, '<?');  

           $xml = new SimpleXMLElement($data);  

      return $xml;  

}  


function twitterDisplay($twitNum = 2){
    $xml = $this::twitterCapture(); 


    for($i= 0; $i<$twitNum; $i++){ 
    echo   "<div class= 'curvebox'>".$xml->status[$i]->text."</div>";

    }
}

}

?>

问题在于,每次我想要更改用户名或密码时,我都必须跳回到类定义,这会使事情变得模块化......而且在很多方面它感觉不对。 那么问题是通过对象接口获取用户名和密码然后用新数据调用twitterDisplay()方法的正确方法是什么?希望这是有道理的。 提前致谢

3 个答案:

答案 0 :(得分:3)

我建议:

$twitter = new TwitterGrub('myUser', 'myPass');
echo $twitter->twitterCapture(); // etc..


<?php
class TwitterGrub{
    private $user;
    private $password;

    function __construct($user, $password) {
        $this->user = $user;
        $this->password = $password;
    }

    function setUser($user) {
        $this->user = $user;
    }

    // same for password


    function twitterCapture() {  


       $ch = curl_init("https://twitter.com/statuses/user_timeline.xml");  
       curl_setopt($ch, CURLOPT_HEADER, 1);  
       curl_setopt($ch,CURLOPT_TIMEOUT, 30);  
       curl_setopt($ch,CURLOPT_USERPWD,$this->user . ":" . $this->password);  
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
       curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);  
       curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);  
       $result=curl_exec ($ch);  
       $data = strstr($result, '<?');  

       $xml = new SimpleXMLElement($data);  

      return $xml;  
}   


function twitterDisplay($twitNum = 2){
    $xml = $this->twitterCapture();  // DONT USE :: here!

    for($i= 0; $i<$twitNum; $i++){ 
        echo   "<div class= 'curvebox'>".$xml->status[$i]->text."</div>";    
    }
}

答案 1 :(得分:2)

将用户和密码存储为成员变量,并将它们传递给构造函数:

class TwitterGrub
{
    private $_username;
    private $_password;

    public function __construct($username, $password)
    {
        $this->_username = $username;
        $this->_password = $password;
    }

    // rest of the code, use $this->_username and $this->_password
}

构造于:

$c = new TwitterGrub('user', 'pass');

答案 2 :(得分:0)

到目前为止所有答案都是正确的,您应该考虑它们,但我只想告诉您,您已经在那里:

您的方法twitterCapture会将用户名和密码作为参数,因此会使用此,并使用以下参数定义您的twitterDisplay函数:

function twitterDisplay($twitNum = 2, $user='default', $passwd='default'){
    $xml = $this->twitterCapture($user, $passwd);

    for($i= 0; $i<$twitNum; $i++){ 
        echo   "<div class= 'curvebox'>".$xml->status[$i]->text."</div>";    
    }
}

然后你可以这样做:

$c = new TwitterGrub();

$c->twitterDisplay('foo', 'secret');
//and
$c->twitterDisplay('bar', 'secret2');