1

php-ews既存の非 OOP Web サイトに実装します。

シェルでスタンドアロンの PHP スクリプトを実行すると、問題なく動作します。

スタンドアロン PHP スクリプトは以下を使用しますuse

use \jamesiarmes\PhpEws\Client;
use \jamesiarmes\PhpEws\Request\CreateItemType;

しかし、私useはウェブサイトのifステートメント内では使用できないので、フルパスを使用してすべてのクラスを追加しました(つまりnew \jamesiarmes\PhpEws\Client.

今、私はこのエラーが発生しています。

Fatal error: Class 'SoapClient' not found in /home/project/master/vendor/jamesiarmes/php-ntlm/src/SoapClient.php on line 13

Soap 拡張機能がインストールされていることを確認しました。助けてください。ありがとう。

if ($_REQUEST['action'] == 'export-form-test') {

    require_once 'vendor/autoload.php';

/*
use \jamesiarmes\PhpEws\Client;
use \jamesiarmes\PhpEws\Request\CreateItemType;

use \jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAllItemsType;
use \jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAttendeesType;

use \jamesiarmes\PhpEws\Enumeration\BodyTypeType;
use \jamesiarmes\PhpEws\Enumeration\CalendarItemCreateOrDeleteOperationType;
use \jamesiarmes\PhpEws\Enumeration\ResponseClassType;
use \jamesiarmes\PhpEws\Enumeration\RoutingType;

use \jamesiarmes\PhpEws\Type\AttendeeType;
use \jamesiarmes\PhpEws\Type\BodyType;
use \jamesiarmes\PhpEws\Type\CalendarItemType;
use \jamesiarmes\PhpEws\Type\EmailAddressType;
*/

    // Replace this with your desired start/end times and guests.
    $start = new DateTime('tomorrow 4:00pm');
    $end = new DateTime('tomorrow 5:00pm');

    // Set connection information.
    $host = '*********';
    $username = '*******';
    $password = '********';
    //$version = Client::VERSION_2016;

    $client = new \jamesiarmes\PhpEws\Client($host, $username, $password);

    // Build the request,
    $request = new \jamesiarmes\PhpEws\Request\CreateItemType();
    $request->SendMeetingInvitations = \jamesiarmes\PhpEws\Enumeration\CalendarItemCreateOrDeleteOperationType::SEND_ONLY_TO_ALL;
    $request->Items = new \jamesiarmes\PhpEws\ArrayType\NonEmptyArrayOfAllItemsType();

    // Build the event to be added.
    $event = new \jamesiarmes\PhpEws\Type\CalendarItemType();
    $event->Start = $start->format('c');
    $event->End = $end->format('c');
    $event->title = 'EWS Test Event';

    // Set the event body.
    $event->Body = new \jamesiarmes\PhpEws\Type\BodyType();
    $event->Body->_ = 'This is the event body';
    $event->Body->BodyType = \jamesiarmes\PhpEws\Enumeration\BodyTypeType::TEXT;

    // Add the event to the request. You could add multiple events to create more
    // than one in a single request.
    $request->Items->CalendarItem[] = $event;

    $response = $client->CreateItem($request);

    // Iterate over the results, printing any error messages or event ids.
    $response_messages = $response->ResponseMessages->CreateItemResponseMessage;
    foreach($response_messages as $response_message) {
        // Make sure the request succeeded.
        if ($response_message->ResponseClass != ResponseClassType::SUCCESS) {
            $return_arr['status'] = 'error';
            continue;
        }

        // Iterate over the created events, printing the id for each.
        foreach($response_message->Items->CalendarItem as $item) {
            $id = $item->ItemId->Id;
            $return_arr['status'] = 'ok';
        }
    }

}
4

2 に答える 2

1

シェルでスタンドアロンの PHP スクリプトを実行すると、問題なく動作します。

しかし

Soap 拡張機能がインストールされていることを確認しました。

どのように確認しましたか?php.iniCLI 環境と Web サーバー環境で異なるファイルをロードしている可能性があることはご存知でしょう。

(たとえば、私の Ubuntu サーバーでは、Apache Web サーバーを使用して、両方を持っています。

/etc/php5/cli/php.ini

/etc/php5/apache2/php.ini)

于 2017-01-09T13:35:36.533 に答える
1

元の質問には答えていませんが、これは次のとおりです。

しかし、私は Web サイトの if ステートメント内で use を使用できないため、すべてのクラスの先頭にフル パス (つまり、new \jamesiarmes\PhpEws\Client) を使用しました。

use名前空間付きクラスをインポートするステートメントは、ファイルの先頭にあり、括弧の外側にあります。それらは常に「実行」されます。つまり、外部クラス名の現在の名前空間内にエイリアス リンクを作成します (名前空間が使用されていない場合は、ルート名前空間が使用されます) - それらが含まれている現在のファイルのみです。現在のファイルの外部に永続的または到達するものはありません。新しいファイルには異なるuseインポートがある場合がありますが、クラスが両方のファイルで使用されている場合は、インポートを繰り返す必要もあります。

名前空間全体に関する章についてはhttp://php.net/manual/en/language.namespaces.phpを参照してください。具体的な使用方法についてはhttp://php.net/manual/en/language.namespaces.importing.phpuseを参照してください。不正なコードを含む例 5 に注意してください。

<?php
namespace Languages;

function toGreenlandic()
{
    use Languages\Danish;

    // ...
}
?>

を使用したクラスのインポートuseは、コードの実行とは無関係です。コードで使用されているすべてのクラスの完全修飾名を PHP が認識できるように、ファイルを解析するときに既に発生しています。コードが実行されたときにのみ自動ロードされuseますが、ファイルの先頭に保持する必要があります。

于 2017-01-11T00:12:20.587 に答える