ホームページ  >  記事  >  バックエンド開発  >  constant_PHP チュートリアルを定義する

constant_PHP チュートリアルを定義する

WBOY
WBOYオリジナル
2016-07-20 11:13:38980ブラウズ

マニュアルを見ると、defineで定義された定数のみが許可されると書かれています:

スカラーと null のみが許可されます。スカラーのタイプは、整数、浮動小数点、文字列、またはブール値です。 定数値のタイプを resource として定義することもできますが、これはお勧めできません。不明な状況が発生する可能性があります。

今日phpのソースコードを読んで、defineの2番目のパラメータが実際にはオブジェクトになり得ることがわかりました。

最初に例を投稿してください:

リーリー

次に、php での定義がどのように実装されるかを見てみましょう:

リーリー

repeatで始まりgoto文も使用しているループに注目してくださいT_T

このコードの機能は次のとおりです:

  • int、float、string、bool、resource、null については、実際に定数を定義するときにこれらの値を直接使用します
  • オブジェクトの場合、オブジェクトを上記の6種類のいずれかに変換する必要があります(変換後もオブジェクトである場合は、変換を続行します)

オブジェクトを6つのタイプのいずれかに変換するにはどうすればよいですか?コードの観点からは、次の 2 つの方法があります:

リーリー

1, Z_OBJ_HT_P(val)->get、マクロ展開後、(*val).value.obj.handlers->get

2、Z_OBJ_HT_P(val)->cast_object、マクロ展開後は (*val).value.obj.handlers->cast_object になります

handlers は、多くの関数ポインターを含む構造体です。詳細な定義については、_zend_object_handlers を参照してください。この構造体の関数ポインタは、オブジェクト属性の読み取り/変更、オブジェクト メソッドの取得/呼び出しなど、オブジェクトを操作するために使用されます。get や Cast_object もその中に含まれます。

一般オブジェクトの場合、php は標準の Cast_object 関数 zend_std_cast_object_tostring を提供します。コードは php-src/zend/zend-object-handlers.c にあります。 リーリー

上記の特定の実装から、デフォルトの Cast_object はクラス内で __tostring メソッドを見つけて呼び出します...

最初の例に戻ります、

('foo',

リーリー

上記のコードには 2 つの状況が含まれています。1 つは、PHP_INT_MAX などの PHP カーネルの事前定義定数を再定義しようとする場合ですが、これは明らかに失敗します。 2 番目のケースは、コード内のどこかで定数 FOO を定義し、次のプログラムで再度定義する場合で、これも失敗の原因になります。したがって、名前の重複を避けるために、コーディング時に定義する必要があるすべての定数をまとめて記述することが最善です。

2、定数名に制限はありません

その名前に要件はなく、もちろん、名前が正当な PHP 変数名である必要もありません。したがって、define の定数に奇妙な名前を付けることができます。例: リーリー

ただし、そのような定数が定義されている場合、それを直接使用することはできず、構文エラーが報告されます。正しい使用方法は以下の通りです

リーリー

http://www.bkjia.com/PHPjc/440356.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/440356.html技術記事マニュアルを見ると、define で定義された定数のみが許可されます: スカラーと null のみが許可されます。スカラーのタイプは、整数、浮動小数点、文字列、またはブール値です。 定数値の型をリソースとして定義することも可能です...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。