【问题标题】:Calling a static method when the class is a variable with namespaces当类是具有命名空间的变量时调用静态方法
【发布时间】:2012-05-02 19:16:25
【问题描述】:

我在一个小框架中使用了以下代码。我的框架最初没有使用命名空间,但由于在这个项目中两个类名发生冲突,我认为现在是尝试这个的好时机。执行脚本时抛出如下错误:

[Wed May 02 15:04:33 2012] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_VARIABLE, expecting T_STRING in /home/marco/Projects/stackgaming.com/app/server.php on line 17

这是与错误相关的以下代码sn-ps:

应用程序/服务器.php

if( !defined('IN_APP') ) { die('THESE ARE NOT THE DROIDS YOU ARE LOOKING FOR'); }

require_once('model/Server.php');

\Model\Server::$save_path = APPLICATION_ROOT . 'servers';

class Server extends App
{
    public static function init($server_id)
    {
        $server_data = \Model\Server::get($server_id);
        $game = $server_data['interface'];
        require_once('model/' . $game . '.php');

        $query_data = \Model\$game::query($server_data['host'], $server_data['query_port']);

        var_dump($server_data);
        var_dump($query_data);

        //static::$View->display('user_main.tpl');
    }
}

这是模型/Minecraft.php 文件,这是 $game 解析的内容。

<?php

namespace Model;

class MinecraftException extends \Exception
{
    // Exception thrown by Minecraft classes
}

class Minecraft
{
    public static function query( $host, $port = 25565, $timeout = 3 )
    {
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

        socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => $timeout, 'usec' => 0));

        if( $socket === false || @socket_connect($socket, $host, (int)$port) === false )
        {
            return false;
        }

        socket_send($socket, "\xFE", 1, 0);
        $len = socket_recv($socket, $data, 256, 0);
        socket_close($socket);

        if( $len < 4 || $data[ 0 ] != "\xFF" )
        {
            return false;
        }

        $data = substr($data, 3);
        $data = iconv('UTF-16BE', 'UTF-8', $data);
        $data = explode("\xA7", $data);

        return array
        (
            'hostname'   => substr($data[0], 0, -1),
            'total_players'    => isset($data[1]) ? intval($data[1]) : 0,
            'max_players' => isset($data[2]) ? intval($data[2]) : 0
        );
    }
}

如果我从 Minecraft 类中删除命名空间,它可以正常工作,但如果我要使用命名空间,我不应该一直走吗?

【问题讨论】:

  • s/minecraft/game-that-is-socially-more-acceptable/g
  • 这个问题已经在 IIRC 之前被问过,但在这个网站上可能更难找到。继续搜索。

标签: php namespaces


【解决方案1】:

我发现这个问题比找到解决方案要早得多。为了大家的利益,这里有一个有用的链接来解决手头的问题:Variable functions with namespaces in PHP

【讨论】:

  • 所以这个问题是个骗子,因为除了“看到这个其他问题,因为它在这里回答了你的问题”之外,你没有其他答案。
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2014-11-13
  • 2021-11-18
  • 1970-01-01
  • 2018-04-16
相关资源
最近更新 更多