亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
Nikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更する
1. 準(zhǔn)備: PHP コードの解析
2. AST を走査し、ターゲット アレイを見つけます。
3. 新しい配列要素を正しく追加する
4. 完全なサンプルコード
5. 注意事項(xiàng)と概要
ホームページ バックエンド開発 PHPチュートリアル Nikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更する

Nikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更する

Oct 15, 2025 pm 05:57 PM

Nikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更する

この記事では、Nikic PhpParser ライブラリを使用して PHP ファイル內(nèi)の配列変數(shù)をプログラムで変更する方法、特に既存の配列に新しい要素を正しく追加する方法について詳しく説明します。この記事では、PHP コードを抽象構(gòu)文ツリー (AST) に解析することで、AST をトラバースする際にターゲット配列を識別する正しい方法を示し、`PhpParser\Node\Expr\ArrayItem` や `PhpParser\Node\Scalar\String_` などの AST ノード クラスを使用して新しい配列項(xiàng)目を構(gòu)築および挿入し、元のデータと AST を直接混合することによって引き起こされるエラーを回避します。 ノード。

Nikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更する

コードの自動化、リファクタリング、靜的分析などのタスクを?qū)g行する場合、PHP コードをプログラムで読み取り、分析、さらには変更する必要がある場合があります。 Nikic PhpParser は、PHP コードを抽象構(gòu)文ツリー (AST) に解析し、これらのツリー構(gòu)造を走査して操作できるようにする強(qiáng)力なツールです。この記事では、Nikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更する方法、特に既存の配列に新しいキーと値のペアを正しく追加する方法に焦點(diǎn)を當(dāng)てます。

1. 準(zhǔn)備: PHP コードの解析

まず、ターゲットの配列変數(shù)を含む PHP ファイルが必要です。次の內(nèi)容を含む first.php ファイルがあるとします。

 <?php 定義("CONSTANT1", "cons1value");

$variable1 = "var1value";

$変數(shù)2 = 配列(
    "キー1" => "値1"、
    「キー2」 => 「値2」
);

私たちの目標(biāo)は、$variable2 を次のように変更することです。

 <?php 定義("CONSTANT1", "cons1value_updated");

$variable1 = "var1value_updated";

$変數(shù)2 = 配列(
    "key1" => "value1_updated",
    "key2" => "value2", // この値は変更されないと仮定するか、必要に応じて変更します。 "key_3_added" => "value3_added"
);

これを?qū)g現(xiàn)するには、Nikic PhpParser を使用して first.php ファイルを解析し、その AST を取得する必要があります。

 <?php &#39;vendor/autoload.php&#39; が必要です。 // Composer オートローダーが設(shè)定されていることを確認(rèn)します。 use PhpParser\Error;
PhpParser\ParserFactory を使用します。
PhpParser\NodeTraverser を使用します。
PhpParser\PrettyPrinter\Standard を使用します。
PhpParser\Node\Expr\ArrayItem を使用します。
PhpParser\Node\Scalar\String_ を使用します。
PhpParser\Node\Expr\Assign を使用します。
PhpParser\Node\Expr\Array_ を使用します。
PhpParser\Node\Expr\Variable を使用します。

$parser = (新しい ParserFactory)->create(ParserFactory::PREFER_PHP7);
$prettyPrinter = 新しい標(biāo)準(zhǔn);
$traverser = 新しい NodeTraverser;

$source = file_get_contents("first.php");

試す {
    $stmts = $parser->parse($source);
    // ここで、変更を処理するカスタム NodeVisitor を追加できます // $traverser->addVisitor(new MyNodeVisitor());
    // $stmts = $traverser->traverse($stmts);
} catch (エラー $error) {
    echo "解析エラー: {$error->getMessage()}\n";
    出口();
}

// $stmts には first.php の抽象構(gòu)文ツリーが含まれるようになりました

2. AST を走査し、ターゲット アレイを見つけます。

$variable2 を変更するには、AST を走査し、対応する変數(shù)代入ステートメントを見つける必要があります。 AST では、変數(shù)の割り當(dāng)ては通常、左側(cè)に変數(shù) (PhpParser\Node\Expr\Variable)、右側(cè)に値 (例: PhpParser\Node\Expr\Array_) を持つ PhpParser\Node\Expr\Assign ノードとして表されます。

 // ... (上記のコードの続き)

foreach ($stmts として $stmt) {
    // 式ステートメント (ExprStmt) であり、式が代入演算 (Assign) であるかどうかを確認(rèn)します。
    if ($stmt インスタンス of PhpParser\Node\Stmt\Expression && $stmt->expr インスタンス of Assign) {
        $assign = $stmt->expr;

        // 代入の左側(cè)が変數(shù)かどうかをチェック if ($assign->var instanceof Variable) {
            // 変數(shù)名が「variable2」かどうかを確認(rèn)します
            if ($assign->var->name === 'variable2') {
                // 代入の右側(cè)が配列かどうかをチェック if ($assign->exprinstanceof Array_) {
                    $arrayNode = $assign->expr;

                    // 現(xiàn)在、$arrayNode は変更したい配列ノードです // 既存の配列項(xiàng)目をループし、'key1' の値を変更します foreach ($arrayNode->items as $item) {
                        if ($item インスタンスの ArrayItem && $item->キー インスタンスオブ String_) {
                            switch ($item->key->value) {
                                ケース「キー1」:
                                    // 'key1' の値を変更します $item->value = new String_("value1_updated");
                                    壊す;
                                ケース「key2」:
                                    // 'key2' も変更したいと仮定します。
                                    // $item->value = new String_("value2_updated");
                                    壊す;
                            }
                        }
                    }

                    // 新しい要素を追加してみます // 間違った方法: PHP 配列を直接追加します // $arrayNode->items[] = ["key3_added" => "value3_added"];
                    // AST ノード リストは生の PHP 配列ではなく、AST ノード オブジェクトを想定しているため、これによりエラーが発生します。
                }
            }
        }
    }
}

// 変更したコードを出力します // echo $prettyPrinter->prettyPrintFile($stmts);

3. 新しい配列要素を正しく追加する

上記のコードで、PHP 配列 ["key3_added" => "value3_added"] を $arrayNode->items に直接追加するのは間違いです。 Nikic PhpParser は抽象構(gòu)文ツリーを処理し、$arrayNode->items は通常の PHP 配列ではなく、PhpParser\Node\Expr\ArrayItem 型のオブジェクトを想定します。

キーと値のペアを適切に追加するには、キーと値を含む ArrayItem ノードを PhpParser\Node\Scalar\String_ またはその他の適切な式ノードとして構(gòu)築する必要があります。

 // ... (上記のコードの続き)

foreach ($stmts として $stmt) {
    if ($stmt インスタンス of PhpParser\Node\Stmt\Expression && $stmt->expr インスタンス of Assign) {
        $assign = $stmt->expr;
        if ($assign->var 変數(shù)のインスタンス && $assign->var->name === 'variable2') {
            if ($assign->expr instanceof Array_) {
                $arrayNode = $assign->expr;

                // 既存のアイテムをトラバースして変更します ($arrayNode->items as $item) {
                    if ($item インスタンスの ArrayItem && $item->キー インスタンスオブ String_) {
                        if ($item->key->value === 'key1') {
                            $item->value = new String_("value1_updated");
                        }
                    }
                }

                // 新しい要素を正しく追加します // 新しいキーを表す文字列ノードを作成します $newKey = new String_("key_3_added");
                // 新しい値を表す文字列ノードを作成します $newValue = new String_("value3_added");
                //ArrayItem ノードを作成し、キーと値を関連付けます $newArrayItem = new ArrayItem($newValue, $newKey);

                //新しく作成した ArrayItem ノードを配列ノードの項(xiàng)目リストに追加します $arrayNode->items[] = $newArrayItem;

                // 1 行で直接記述することもできます // $arrayNode->items[] = new ArrayItem(new String_("value3_added"), new String_("key_3_added"));
            }
        }
    }
}

// 変更したコードを出力 echo $prettyPrinter->prettyPrintFile($stmts);

上記のコードを?qū)g行すると、次の出力 (または PrettyPrinter の構(gòu)成に応じて同様の形式) が得られます。

 <?php 定義("CONSTANT1", "cons1value");
$variable1 = "var1value";
$変數(shù)2 = 配列(
    "key1" => "value1_updated",
    "キー2" => "値2",
    "key_3_added" => "value3_added"
);

4. 完全なサンプルコード

プロセス全體をより明確に示すために、すべての手順を含む完全な例を次に示します。

 <?php &#39;vendor/autoload.php&#39; が必要です。

PhpParser\Error を使用します。
PhpParser\ParserFactory を使用します。
PhpParser\NodeTraverser を使用します。
PhpParser\PrettyPrinter\Standard を使用します。
PhpParser\Node\Expr\ArrayItem を使用します。
PhpParser\Node\Scalar\String_ を使用します。
PhpParser\Node\Expr\Assign を使用します。
PhpParser\Node\Expr\Array_ を使用します。
PhpParser\Node\Expr\Variable を使用します。
PhpParser\Node\Stmt\Expression を使用します。 //Expression ノードの導(dǎo)入 // 1. サンプル PHP ファイルを作成します file_put_contents(&#39;first.php&#39;, &#39;<?php)

定義("CONSTANT1", "cons1value");

$variable1 = "var1value";

$変數(shù)2 = 配列(
    "キー1" => "値1"、
    「キー2」 => 「値2」
);
');

// 2. パーサーとプリンターを初期化します $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$prettyPrinter = 新しい標(biāo)準(zhǔn);
$traverser = 新しい NodeTraverser; // この例では直接トラバースしますが、NodeTraverser はより一般的なメソッドです $source = file_get_contents("first.php");

試す {
    $stmts = $parser->parse($source);
} catch (エラー $error) {
    echo "解析エラー: {$error->getMessage()}\n";
    出口();
}

// 3. AST をトラバースし、foreach に変更します ($stmts as $stmt) {
    // 式ステートメントであるかどうかを確認(rèn)します (Stmt\Expression)
    if ($stmt 式のインスタンス && $stmt->expr 割り當(dāng)てのインスタンス) {
        $assign = $stmt->expr;

        // 代入の左側(cè)が変數(shù)であり、変數(shù)名が 'variable2' であるかどうかを確認(rèn)します。
        if ($assign->var 変數(shù)のインスタンス && $assign->var->name === 'variable2') {
            // 代入の右側(cè)が配列かどうかをチェック if ($assign->exprinstanceof Array_) {
                $arrayNode = $assign->expr;

                // 既存の配列項(xiàng)目をループし、'key1' foreach の値を変更します ($arrayNode->items as $item) {
                    if ($item インスタンスの ArrayItem && $item->キー インスタンスオブ String_) {
                        if ($item->key->value === 'key1') {
                            // 'key1' の値を変更します $item->value = new String_("value1_updated");
                        }
                    }
                }

                // 新しい配列要素を追加 'key_3_added' => 'value3_added'
                $arrayNode->items[] = new ArrayItem(
                    new String_("value3_added"), // 値ノード new String_("key_3_added") // キーノード);
            }
        }
    }
}

// 4. 変更されたコードを出力します $modifiedCode = $prettyPrinter->prettyPrintFile($stmts);
echo "--- 変更された PHP コード ---\n";
$modifiedCode をエコーし??ます。

// 5. サンプル ファイルをクリーンアップします。 unlink('first.php');

5. 注意事項(xiàng)と概要

  1. AST 構(gòu)造を理解する: Nikic PhpParser の中核は抽象構(gòu)文ツリーです。すべてのコード要素は、特定の PhpParser\Node オブジェクトとして表されます。コードを変更または追加する必要がある場合は、対応する Node サブクラスを使用してコードを構(gòu)築する必要があります。
  2. 生データと AST ノードを區(qū)別する:これはよくある落とし穴です。たとえば、配列操作では、$arrayNode->items は ArrayItem オブジェクトのリストであり、通常の PHP 配列のリストではありません。 PHP 配列を直接追加しようとすると、型の不一致エラーが発生します。
  3. 正しいノード クラスを使用します。文字列リテラルの場合は、PhpParser\Node\Scalar\String_ を使用します。整數(shù)の場合は、PhpParser\Node\Scalar\LNumber を使用します。変數(shù)には、PhpParser\Node\Expr\Variable などを使用します。
  4. use ステートメントの重要性: PhpParser のさまざまなノード クラスを使用する場合は、ファイルの先頭に use PhpParser\Node\Expr\ArrayItem などの正しい use ステートメントを必ず追加してください。完全修飾クラス名の冗長性を避けるため。
  5. バージョンの互換性: Nikic PhpParser ライブラリの異なるバージョン間では API の違いが存在する可能性があります。この記事の例は新しいバージョン (nikic/php-parser 4.x シリーズなど) に基づいています。プロジェクトで使用されているライブラリのバージョンがそれと互換性があることを確認(rèn)してください。

これらの原則に従うことで、複雑な PHP コードの操作と変換に Nikic PhpParser を効果的に利用できます。プログラムによるコード変更を成功させるには、AST の內(nèi)部構(gòu)造を理解することが重要です。

以上がNikic PhpParser を使用して PHP ファイル內(nèi)の配列変數(shù)を変更するの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

メールアドレスがPHPで有効かどうかを確認(rèn)する方法は? メールアドレスがPHPで有効かどうかを確認(rèn)する方法は? Sep 21, 2025 am 04:07 AM

usefilter_var()tovalidateemailsyntaxandcheckdnsrr()toverifydomainmxrecords.example:$ email = "user@example.com"; if($ email、filter_validate_email)

PHPでオブジェクトの深いコピーまたはクローンを作成する方法は? PHPでオブジェクトの深いコピーまたはクローンを作成する方法は? Sep 21, 2025 am 12:30 AM

useunserialize(serialize($ obj))fordeepcopying whenalldataisserializable;それ以外の場合は、__clone()tomaniallyduplicatededededededavoidsharedReferenceを?qū)g裝します。

PHPで2つの配列をマージする方法は? PHPで2つの配列をマージする方法は? Sep 21, 2025 am 12:26 AM

usearray_merge()tocombinearrays、urblitingduplicatestringkeysandreindexingnumerickeys; forsimplerconcatenation、inthphp5.6、usethesplatoperator [... $ array1、... $ array2]。

PHPプロジェクトで名前空間を使用する方法は? PHPプロジェクトで名前空間を使用する方法は? Sep 21, 2025 am 01:28 AM

NamesSpacesInphporganizeCodeandPreventnamingConflictsByGroupingClasses、インターフェイス、関數(shù)、およびコンテンダントアンダースピフィクティフィクティフィクティフィクティフィクショナル

PHPを使用してデータベースでレコードを更新する方法は? PHPを使用してデータベースでレコードを更新する方法は? Sep 21, 2025 am 04:47 AM

toupdateadatabaserecordinphp、firstconnectusingpdoormysqli、thenuseprepreadedStatementStoeaseaseesecuresQlupDateQuery.example:$ pdo = newpdo( "mysql:host = localhost; dbname = your_database"、$ username、$ username、$ sibsfar

PHPの魔法の方法とは何ですか? `__call()`および `__get()`の例を提供します。 PHPの魔法の方法とは何ですか? `__call()`および `__get()`の例を提供します。 Sep 20, 2025 am 12:50 AM

the__call()メソッドは、customhandlingbyacceptingthemetodnameandarguments、ashownwhencollingdsslikesayhello()

PHPでファイル拡張機(jī)能を取得するにはどうすればよいですか? PHPでファイル拡張機(jī)能を取得するにはどうすればよいですか? Sep 20, 2025 am 05:11 AM

usepathinfo($ filename、pathinfo_extension)togetthefileextension; itreliailailavaliavelyhandlesmultipledotsendedgecases、returningtheextension(例えば、 "pdf")oranemptystringifnoneexists。

PHPでファイルのzipアーカイブを作成する方法は? PHPでファイルのzipアーカイブを作成する方法は? Sep 18, 2025 am 12:42 AM

ziparchiveクラスを使用して、zipファイルを作成します。最初にターゲットZIPをインスタンス化して開き、AddFileを使用してファイルを追加し、カスタム內(nèi)部パスをサポートし、再帰関數(shù)はディレクトリ全體をパッケージ化でき、最終的にはPHPに書き込みアクセス許可があることを確認(rèn)するために保存します。

See all articles