2012-04-18 9 views
2

を呼び出し、呼び出しなさい:PHP:次の関数を仮定すると、参照配列名

function doSomething(&$someArray) { 
    // Do something to $someArray 
} 

$names=array("John", "Paul", "George", "Ringo"); 
doSomething($names); 

する関数内から参照される配列(この場合は「名前」)の名前を取得する方法はありますか?私は、配列変数の名前のために関数に別の引数を追加するためにリファクタリングすることができますが、それはバグを招くだけです。ユースケースは、各配列$ someSillyNameに対して、関数はデータベーステーブルsomeSillyNameにアクセスする必要があるということです。

ありがとうございました。

+2

いいえ、ありません。 '$ names'は呼び出し側の名前* local *です。その情報は、呼び出された関数では利用できません。呼び出し元のソースコードを読むことができません。 – Borealid

+0

@Borealidは、あなたがそこで提供したものではなく、シンプルな配列には、そのような情報を得るためにアクセスできるnameプロパティはありません。ただし、クラスを渡した場合は、クラス名を取得できますが、その場合でも変数の名前は取得できません。 –

+0

あなたのユースケースからどこに来ているのかが分かりますが、間違った方法であると私には信じています。 2つの異なる結果を取り出して '$ names1'と' $ names2'に格納する必要がある場合はどうなりますか?コードが壊れたり、コードを不必要に複雑にしたりするために、後方に曲げる必要があります。 *それはバグにつながる*問題です。 – deceze

答えて

2

PHPでこれを行う方法はありません。

さらに、アプリケーションロジックに変数名を使用しないでください。これはまた、アプリケーションの他の部分であなたを助けるべきである

$dbData = array(
    'names' => array("John", "Paul", "George", "Ringo") 
); 

:想像し、誰かが何か他のものにあなたの$名をリファクタリング..あなたはこのようにあなたの配列を修正することができます。本当にこのようにしたい場合は、この配列をカプセル化し、getDatabaseName();getData();のようなものを提供するクラスを作成することをお勧めします。

+0

ありがとうございます。そのようなリファクタリングについて私は見ていきます。 – dotancohen

4

番号*
doSomethingが仕事をするために必要な情報の場合は、それを引数として渡します。

*デバッグバックトレースとたくさんのイントロスペクションを使用できますが、それはのinsaneです。呼び出し元のスコープ内の変数名は何にも影響を与えません。

+0

ありがとうございます。それは私が恐れていたものです。 – dotancohen

+0

私の答えを見直してここに追加したいと思います: ジョブを実行するために引数を渡す必要がある場合は、アーキテクチャに問題があります。これは手続きの日からの開発者の共通の問題です。この方法に従うと、追加の/別のタスクを実行する必要がある場合にのみ、より多くの引数が追加されます。一般に、引数を追加する必要があると感じる場合は、オブジェクトを再検討する必要があります。 そうでなければ、一連のパラメータ、IFおよび維持不能なコードで失われることになります。 –

関連する問題