2

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

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

还有一个错误说:

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

(这里还有截图: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 行位于“停止编辑”行下方。有人有什么建议吗?或者也许需要我清理一些事情?

4

1 回答 1

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->$foowith 。$this->foo

正如@Aatch 的评论中所指出的,请参阅有关变量变量的文档以获得进一步的解释。但那是你不小心遇到的。

于 2012-07-23T23:51:12.050 回答