ホームページ >バックエンド開発 >PHPチュートリアル >constant_PHP チュートリアルを定義する
マニュアルを見ると、defineで定義された定数のみが許可されると書かれています:
スカラーと null のみが許可されます。スカラーのタイプは、整数、浮動小数点、文字列、またはブール値です。 定数値のタイプを resource として定義することもできますが、これはお勧めできません。不明な状況が発生する可能性があります。
今日phpのソースコードを読んで、defineの2番目のパラメータが実際にはオブジェクトになり得ることがわかりました。
最初に例を投稿してください:
リーリー次に、php での定義がどのように実装されるかを見てみましょう:
リーリーrepeatで始まりgoto文も使用しているループに注目してくださいT_T
このコードの機能は次のとおりです:
オブジェクトを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 の定数に奇妙な名前を付けることができます。例: リーリー
ただし、そのような定数が定義されている場合、それを直接使用することはできず、構文エラーが報告されます。正しい使用方法は以下の通りですリーリー