3

spl_autoload_registerクラスをロードするために使用しています。

ファイルをindex.php含むファイルがありinit.phpます。spl_autoload_register関数はファイルで呼び出されますinit.php

ファイルではindex.php、適切に動作します。クラスなどを作成でき、それらの名前は解決されます。

しかし後で、特定のタスクを実行するためindex.phpに別のファイルを に含めます。work.php

奇妙なことに、work.php私が使用しているクラスが見つかりません。

spl_autoload_registerでもう一度を呼び出すとwork.php、クラスを解決できます。

奇妙な点は、この動作に一貫性がないことです。テスト サーバーではspl_autoload_register呼び出しを複製する必要はありませんが、運用サーバーでは必須です。

にいくつかのオプションがありphp.iniませんか?

編集/更新:init.php念のため、ファイルの内容を次に示します。

<?php
function my_autoload($class){
    include 'class/' . $class . '.class.php';
}

spl_autoload_register('my_autoload');
?>

そして私のindex.php:

<?php
require_once 'include/init.php';

$barcode = new Barcode();
// here is a bunch of test and stuff
include 'work.php';
?>

そして私のwork.php:

<?php
$myObj = new Barcode();
// more useles stuff
?>

バーコードは、index.php コード部分では問題なく作成されますが、work.php 部分では失敗します...

4

2 に答える 2

5

いや、実は私はバカです。問題はインクルード パスなどではなく、Apache の構成: MultiViews にありました。

私のウェブサイトには、index.php という 1 つのアクセス ポイントがあります。そして、URL 書き換えを使用してすべてをリダイレクトします。しかし、マルチビュー オプションのおかげで、URL がファイルと同じ名前の場合、URL の書き換えが正しく機能しませんでした。

私のディレクトリには index.php と work.php が含まれています。

書き直した私のスクリプトは次のようなものでした。www.mywebsite.com/work にアクセスすると、param url=work を指定して index.php に移動します。index.php はすべてを初期化し、次に work.php をインクルードします

しかし、MultiViews オプションのおかげで、www.mywebsite.com/work にアクセスすると、ファイルが検索され、work.php が見つかり、それが直接呼び出されます。意味: 初期化なし、意味: spl_autoload_register なし。

ご回答ありがとうございます。申し訳ありません。

于 2012-06-22T09:03:52.590 に答える
4

include_pathローカル ディレクトリが含まれている場合は、設定を確認してください。

一般に、相対パスを使用することはお勧めできません。次のように、init.php ファイルに相対する絶対パスを簡単に作成できます。

function my_autoload($class){
    include __DIR__.'/class/' . $class . '.class.php';
}

このコードは、init.php ファイルが「class」フォルダーと同じフォルダーにあることを前提としています。

また、指定されたパスに存在する場合と存在しない場合があるファイルをやみくもにインクルードしてエラーを作成する可能性がある代わりに、ファイルをインクルードする前にその存在を確認してください。

function my_autoload($class){
    $file = __DIR__.'/class/' . $class . '.class.php';
    if(file_exists($file)) {
       include $file;
    }
}

__DIR__は、PHP 5.2 のホストでは使用できない PHP 5.3 の機能であることに注意してください。あなたはそれを置き換えることができますdirname(__FILE__)

また、Linux ではファイルは大文字と小文字を区別して検索されることに注意してください。ほとんどの Mac OS X インストールでは、ファイルは大文字と小文字を区別せずに検索されます。クラスをインスタンス化MyClassすると、Linux は検索しますが、Mac OS X は、クラスが、などMyClass.class.phpのファイルにある場合はクラスもロードします。myclass.class.phpMyclass.class.php

于 2012-06-20T10:32:47.917 に答える