0

理解できない奇妙な問題があります。PEARPHPページからメールを送信するために使用しています。クラスは機能していますSend_Mail(SMTPを使用してメールを送信しています)が、に関連してこの奇妙な警告が表示されますautoloader

Warning: include(classes/LOGIN.php) 
[<a href='function.include'>function.include</a>]: 
failed to open stream: No such file or directory in 
C:\xampp\htdocs\mysite\initialize.php on line 46`

私のinitialize.phpファイルには、次のものがあります。

function autoloader($class) {
    include 'classes/' . $class . '.php';
}

spl_autoload_register('autoloader');

そして私のheader.phpファイルでは、サイトのいくつかのPHPクラスをロードしています。

// autoload PHP classes for site
autoloader('Navigation');
autoloader('Validation');

エラーは、私が持っていないLOGINクラスを参照しています。しかし、私は自分のサイトフォルダ全体を検索し、php次の2行を見つけましたC:\xampp\php\PEAR\Net\SMTP.php

/* These standard authentication methods are always available. */
$this->setAuthMethod('LOGIN', array($this, '_authLogin'), false);
$this->setAuthMethod('PLAIN', array($this, '_authPlain'), false);

を含む行をコメントアウトするLOGINと、同じ警告が表示されますがPLAIN、両方の行をコメントアウトすると、警告は消えます(ただし、SMTP認証は失敗します)。

なぜこうなった?

アップデート

これが私の新しいautoloaderです:

function autoloader($class) {

    if (file_exists('classes' . $class . '.php')) {
        include 'classes' . $class . '.php'; 
    }
}

ただし、エコーする'classes' . $class . '.php'と、次のようになります。

classes/.php

そして、それを使用しないように戻すと、file_exists機能しますが、echoそれでも表示されますclasses/.php

4

2 に答える 2

1

使用しているNet_SMTPのバージョンはわかりませんが、このsetAuthMethod関数は、メソッド名、クラス、オブジェクト、呼び出し可能オブジェクトなど、さまざまな種類の構造体をパラメーターとして受け取ります。

PHPは動的に型付けSMTP.phpされるため、Net_SMTPでは、オブジェクトのタイプを判別するために、そのオブジェクトに対して多くのチェックを行う必要があります。その一環として、「LOGIN」がクラス名であるかどうかを判別しようとします。これにより、オートローダーが呼び出されます。

解決策は、インクルードを試す前にオートローダーでを実行することですfile_existsが、もちろん、インクルードパスが何らかの形で複雑な場合は、基本的に頭痛の種になります。包括的なオートローダーの作成を扱ったことがある人なら誰でも、あなたの苦痛を知っています。

于 2013-02-15T19:35:48.717 に答える
0

autoloader単純なものに戻しましたが、問題なく機能しているようです。

function autoloader($class) {
    include 'classes/' . $class . '.php';
}

spl_autoload_register('autoloader');

提案をありがとう。

于 2013-03-22T22:47:22.870 に答える