php - 调用函数时出错

标签 php bots

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

Notice: Undefined variable: ip in C:\wamp\www\BotRaid.php on line 40

还有一个错误:

Fatal Error: Cannot access empty property in C:\wamp\www\BotRaid.php on line 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 行位于“停止编辑”行下方。有人有什么建议吗?或者也许需要我澄清一些事情?

最佳答案

您错误地访问了类的属性。

行:

$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,因为您在整个类(class)中都使用了该表示法。

正如 @Aatch 的评论中所述,请参阅 variable variables 上的文档以获得进一步的解释。但这就是您无意中遇到的情况。

关于php - 调用函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11622175/

相关文章:

ruby - 使用 Mechanize 按标签选择表单字段?

php - 在数据库中安全存储 HTML,而不影响字符编码

php - 将两个数组二一组合并设置键

php - 在 PHP 中设置包含路径间歇性失败

ruby - 好的 ruby​​ irc 客户端库

Payload 函数的 Python 随机函数不起作用

php - 这个访客是机器人还是用户? PHP

php - 我如何将寻呼机提供给 drupal_add_tabledrag

php - 如何从 Paypal 取回值(value)?

python - 每 30 分钟自动重启一个 .py