调用函数时出错

时间:2012-07-23 23:48:37

标签: php bots

我一直在努力寻找答案,但最终难倒了。我一直在编写代码以允许多个机器人连接到聊天框。我写了所有主要代码并检查过来以确保它一切正常。然后,当我调用使其工作所需的函数时,它给了我一个错误说:

  

注意:未定义的变量:第40行的C:\ wamp \ www \ BotRaid.php中的ip

还有一个错误说:

  

致命错误:无法访问C:\ wamp \ www \ BotRaid.php中的空属性   在第40行

(此处还有截图:http://prntscr.com/ckz55

<?php

    date_default_timezone_set("UCT");
    declare(ticks=1);
    set_time_limit(0);

    class BotRaid
    {
        public $ip="174.36.242.26";
        public $port=10038;
        public $soc = null;
        public $packet = array();

        ##############################
        #   You can edit below this  #
        ##############################
        public $roomid="155470742";
        public $userid = "606657406";
        public $k = "2485599605";

        public $name="";
        public $avatar=;
        public $homepage="";
        ##############################
        #        Stop editing        #
        ##############################

        public function retry()
        {
            $this->connect($this->$ip,$this->$port); //Line 40, where I'm getting the error now.
            $this->join($this->$roomid);

            while($this->read()!="DIED");
        }

        public function connect($ip, $port)
        {
            if($this->$soc!=null) socket_close($this->$soc);
            $soc = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
            if(!$this->$soc)$this->port();
            if(!socket_connect($this->$soc,$this->$ip,$this->$port))$this->port();
        }

        public function port()
        {
            $this->$port++;
            if($this->$port>10038) $this->$port=10038;
            $this->retry();
        }

        public function join($roomid)
        {
            $this->send('<y m="1" />');
            $this->read();
            $this->send('<j2 q="1" y="'.$this->$packet['y']['i'].'" k="'.$this->$k.'" k3="0" z="12" p="0" c"'.$roomid.'" f="0" u="'.$this->$userid.'" d0="0" n="'.$this->$name.'" a="'.$this->$avatar.'" h="'.$this->$homepage.'" v="0" />');
            $this->port();
            $this->$roomid;
        }

        public function send($msg)
        {
            echo "\n Successfully connected.";
            socket_write($this->$soc, $this->$msg."\0", strlen($this->$msg)+1);
        }

        public function read($parse=true)
        {
            $res = rtrim(socket_read($this->$soc, 4096));
            echo "\nSuccessfully connected.";
            if(strpos(strtolower($res), "Failed"))$this->port();
            if(!$res) return "DIED";
            $this->lastPacket = $res;
            if($res{strlen($res)-1}!='>') {$res.=$this->read(false);}
            if($parse)$this->parse($res);
            return $res;
        }

        public function parse($packer)
        {
            $packet=str_replace('+','@più@',str_replace(' ="',' @=@"',$packet));
            if(substr_count($packet,'>')>1) $packet = explode('/>',$packet);
            foreach((Array)$packet as $p) {
                $p = trim($p);
                if(strlen($p)<5) return;
                $type = trim(strtolower(substr($p,1,strpos($p.' ',' '))));
                $p = trim(str_replace("<$type",'',str_replace('/>','',$p)));
                parse_str(str_replace('"','',str_replace('" ','&',str_replace('="','=',str_replace('&','__38',$p)))),$this->packet[$type]);
                foreach($this->packet[$type] as $k=>$v) {
                    $this->packet[$type][$k] = str_replace('@più@','+',str_replace('@=@','=',str_replace('__38','&',$v)));
                }
            }   
        }
    }

    $bot = new BotRaid; //This is where I had the error originally
    $bot->retry();

?>

第40行位于“停止编辑”行下方。有人有什么建议吗?或者也许需要我澄清一些事情?

1 个答案:

答案 0 :(得分:5)

您正在错误地访问该类的属性。

该行:

$this->connect($this->$ip,$this->$port);

应该是:

$this->connect($this->ip, $this->port);

由于没有名为$ip的局部变量,因此在尝试访问属性时,您的表达式正在评估$this->,因为PHP允许您使用变量访问属性和函数。

例如,这可行:

$ip = 'ip';
$theIp = $this->$ip; // evaluates to $this->ip

// or a function call
$method = 'someFunction';
$value  = $this->$method(); // evaluates to $this->someFunction();

由于您在整个课程中使用了这种表示法,因此您必须使用$this->$foo更改$this->foo的所有出现次数。

如@Aatch的评论中所述,请参阅variable variables上的文档以获取进一步说明。但这就是你偶然遇到的情况。