1

奇妙な問題が発生しています。ホストサーバーにアップロードする前に、xamppサーバーでWebサイトのローカルホストを開発しています。ついにホームページをロードできるように、Web サイトの基本的なコンポーネントを完成させました。すべてが計画どおりに機能しました。

そのため、ホスト サーバーにアップロードすることにし、MySQL 資格情報を設定しました。これで動作するはずです。ええと..いいえ、そうではありませんでした。空のページです。

echo 'test';そこで私は手袋をはめ、何が起こっているのかを追跡できるように、ランダムな表現でコードを掘り下げ始めまし た。実行されるまでis_callable()は問題なく動作しているようです。

is_callable()実行する必要が__autoload($class)あるので、試しましたvar_dump($class)

それは私にこの結果を与えました:

string(11) "Initializer" 
string(8) "Database" 
string(14) "PageController" 
string(14) "BaseController" 
string(14) "pcu2phmmr6pam3" 
string(14) "pcu2phmmr6pam3" 

これで、最後の 2 つを除いて、ここにリストされているすべてのクラスがそこにあるはずです。どこにも設定した文字列ではないため、その名前の由来はわかりません。

Google が私に示した唯一の結果pcu2phmmr6pam3は、同様の問題を抱えている別の Web サイトでした。

今、本当に奇妙なことが起こります。私の autoload 関数は次のようになります。

function __autoload($class) {
    var_dump($class);
    if (file_exists(ROOT_PATH . DS . 'site' . DS . 'class' . DS . $class . '.class.php')) {
        require_once(ROOT_PATH . DS . 'site' . DS . 'class' . DS . $class . '.class.php');
    } else if (file_exists(ROOT_PATH . DS . 'site' . DS . 'controller' . DS . $class . '.class.php')) {
        require_once(ROOT_PATH . DS . 'site' . DS . 'controller' . DS . $class . '.class.php');
    } else if (file_exists(ROOT_PATH . DS . 'site' . DS . 'model' . DS . $class . '.class.php')) {
        require_once(ROOT_PATH . DS . 'site' . DS . 'model' . DS . $class . '.class.php');
    } else{
        throw new Exception('Class `' . $class . '` could not be loaded!');
    }
}

ロードする必要があるすべてのクラスがロードされます。存在しないクラスを作成したい場合は、例外がスローされます。

しかし、pcu2phmmr6pam3「クラス」の場合はそうではありません。設定したにもかかわらず、例外はスローされず、画面にエラーが出力されましたerror_reporting(E_ALL)

の周囲のコードは次のis_callable()とおりです。

    $controllerName = ucfirst($this->structure) . 'Controller';
    $action = strtolower(((!empty($this->uri[1]))?$this->uri[1]:'index'));

    if (is_callable(array($controllerName, $action))) {
        $controller = new $controllerName($this->uri, $this->database, $this->structure, $action, $page);
        $controller->$action();
    } else if (is_callable(array($controllerName, 'index'))) {
        $controller = new $controllerName($this->uri, $this->database, $this->structure, 'index', $page);
        $controller->index();
    } else {
        $controller = new NotfoundController($this->uri, $this->database, 'Notfound', 'index', $page);
        $controller->index();
    }

私があなたに提供できる最後の情報:

私のローカルホスト xampp サーバーは PHP 5.4.7 を実行し、ホスト サーバーは PHP 5.3.20 を実行します。


解決済み、奇妙なクラス名がどのように表示されたのかわかりません。誰かが知っていれば、理由を知りたいです:)

4

1 に答える 1

1

静的メソッドを呼び出す同様の問題がありました。(と同じspl_autoload_register())

function __autoload ($className) {
  echo $className."\n";
}

class ClassName {
  function functionName () {
  }
}

//calls __autoload twice with class name 'a22h1pd_t'
is_callable( array('ClassName', 'functionName') );

//doesn't call __autoload
is_callable('ClassName::functionName');

この最小限の例を見ると、それは明らかです。のstaticキーワードがfunctionNameありません。それを追加すると、両方の構文が期待どおりに動作するという問題が解決しました。

于 2014-12-17T14:12:14.087 に答える