8

PHPでは、可変変数を使用できます...

例えば...

class obj { }
$fieldName = "Surname";
$object = new obj();
$object->Name = "John";
$object->$fieldName = "Doe";
echo "{$object->Name} {$object->Surname}"; // This echoes "John Doe".

ただし、$fieldName 文字列には、変数名に使用できない文字が含まれている場合があります。PHP は引き続きその名前のフィールドを作成しますが (連想配列とよく似ています)、正しく解析されないため、$object->...... でそれにアクセスすることはできません。

さて、文字列を有効な PHP 変数名として使用できるかどうかを確認できる関数はありますか。そうでない場合、これは正規表現を使用してどのように作成されますか? PHPの変数名の規則は何ですか?

4

7 に答える 7

16

マニュアルから:

変数名は、PHP の他のラベルと同じ規則に従います。有効な変数名は、文字またはアンダースコアで始まり、任意の数の文字、数字、またはアンダースコアが続きます。正規表現としては、次のように表現されます。'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

そのため、文字列を RegEx で実行した場合、それが有効かどうかを判断できるはずです。

可変変数を使用して「無効な」オブジェクト プロパティ名にアクセスする機能は、一部の XML 解析では正しいアプローチであることに注意してください。

たとえば、SimpleXMLドキュメントから:

PHP の命名規則で許可されていない文字 (ハイフンなど) を含む XML ドキュメント内の要素にアクセスするには、中かっことアポストロフィで要素名をカプセル化します。

このコード例が続きます。

echo $xml->movie->{'great-lines'}->line;

したがって、この方法でしかアクセスできないプロパティを持つことは、必ずしも間違っているわけではありません。

ただし、コードがオブジェクトの作成と使用の両方を行う場合、なぜそのような種類のプロパティを使用するのか疑問に思うでしょう。SimpleXMLもちろん、コントロールの範囲外の何かを表すためにオブジェクトが作成される例と同様の状況を許可します。

于 2010-10-20T16:33:21.820 に答える
9

すでに返信されていますが、完全なコード行は含まれていません。

if ( preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/','evaluation string') )
{
    // the string is valid
}
else
{
    // the string is not valid
}
于 2012-02-29T10:57:50.900 に答える
4

'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'PHP 変数名を検証します。

この正規表現は、次のドキュメントから直接引用しています: http://www.php.net/manual/en/language.variables.basics.php

于 2010-10-20T16:32:20.133 に答える
1

ただし、`$fieldName 文字列には、変数名に使用できない文字が含まれている場合があります。PHP は引き続きその名前でフィールドを作成しますが (連想配列によく似ています)、正しく解析されないため、$object->...... でそれにアクセスすることはできません。

$object->{"fieldname"}構文を介してフィールドにアクセスすることは引き続き可能です。

私の知る限り、唯一の制限は\x00、名前に を含むプロパティにアクセスできず、 で始まる変数を定義できないことです\x00

例:

$a = new stdclass;
$a->{"\x00dd"} = 8; //invalid
$a->{"dd\x00dd"} = 8; //valid, but...
echo $a->{"dd\x00dd"}; //can't read (no property "dd")
于 2010-10-20T16:36:28.480 に答える
1

しかし、正しく解析されないため、 $object->...... でアクセスすることはできません

でも、見てください:

class A {}

$varName = '!asd asd';
$a = new A();
$a->$varName = '1';
echo "{$a->{'!asd asd'}}"; // 1

確かに推奨されていませんが、それは可能です。

于 2010-10-20T16:37:32.570 に答える
0

私は正規表現が進むべき道だと思います。覚えている限り、制限は次のとおりです。

  • 英数字
  • 文字で始まる必要があります
  • アンダースコアを含めることができます

したがって、正規表現は「/ [a-zA-Z] + [0-9a-zA-Z_] * /」になります-私の頭の上から離れているので、マイレージは異なる場合があります。

于 2010-10-20T16:34:52.687 に答える