Вопрос об объектной ориентации в php - PullRequest
1 голос
/ 27 мая 2010

Я столкнулся с проблемами, пытаясь написать несколько классов, вот пример: У меня есть этот класс под названием 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 ]

3 голосов
/ 27 мая 2010

Я предлагаю:

$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>";    
    }
}
2 голосов
/ 27 мая 2010

Сохраните имя пользователя и пароль в качестве переменных-членов и передайте их конструктору:

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');
0 голосов
/ 27 мая 2010

Все ответы пока верны, и вы должны их рассмотреть, но я просто хочу показать вам, что вы уже там:

Ваш метод 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');
...