【问题标题】:Fatal error: Method name must be a string致命错误:方法名称必须是字符串
【发布时间】:2012-11-08 17:45:58
【问题描述】:

我收到错误:

致命错误:方法名称必须是 C:\xampp\htdocs\index.php 第 15 行中的字符串

第 15 行:

$obj = new $url[0]();

代码:

<?php
error_reporting(E_ALL ^ E_NOTICE);

$url = $_GET['url'];
$url = explode('/', $url);

if (!file_exists('controllers/' . $url[0] . '.php')) {
    $url[0] = 'error';   // error kontroleris 
}    
require 'controllers/' . $url[0] . '.php';

$obj = new $url[0]();
$obj->$url[1]();

顺便说一句:脚本还没有完成。

【问题讨论】:

  • 这是什么版本的PHP?

标签: php oop fatal-error


【解决方案1】:

其实就是这样的语法:

$urls = array('DOMDocument');
$dom = new $urls[0]('');
var_dump( $dom );

... 即使在 PHP 5.2 (proof) 中也有效。但是这条线...

$obj->$url[1]();

... 非常有能力(另一个 proof)抛出与您显示的完全相同的错误,因为您不会在代码中的任何位置检查 url 数组长度。

【讨论】:

    【解决方案2】:
    $_GET['url'] = 'foo/bar'; // temp set $_GET
    $url = $_GET['url'];
    $url = explode('/', $url);
    
    if (file_exists('controllers/' . $url[0] . '.php')){
        require 'controllers/' . $url[0] . '.php';
    }else{
        $url[0] = 'error'; 
    }
    
    $obj = new URL;
    if(method_exists($obj,$url[0])){ // test that method exists
        echo $obj->$url[0](); // or whatever your handling may be
    }
    
    class URL{
        public function error(){
            $return = 'this is for the error handling';
            return $return;
        }
    }
    

    【讨论】:

    • 现在它说有一个空属性,它不能访问它:/
    • 您是否确保您使用的是$obj-&gt;url 而不是$obj-&gt;$url
    • 然后它说函数名必须是一个字符串:D
    • 我对代码进行了一些修改,基于我认为您想要实现的目标
    • 现在它只是说“这是用于错误处理” 但它应该显示来自两个回显控制器的代码 也许你有Skype?我会联系你
    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2022-06-17
    • 2020-05-26
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多