|
View:
New views
3 Messages
—
Rating Filter:
Alert me
|
|
|
[PHP-dev 1353] echo,printの実装浅野です。
echo,printの処理はどこで行っているのでしょうか? printfなどの標準関数はext/standard/以下に在るようですが。 マニュアルには「正確には関数ではなく言語構造」とありますがどういうことでしょう? _______________________________________________ PHP-dev mailing list PHP-dev@... http://ml.php.gr.jp/mailman/listinfo/php-dev |
|
|
[PHP-dev 1354] Re: echo,printの実装こんばんわ、桝形です。
> 浅野です。 > > echo,printの処理はどこで行っているのでしょうか? 意外と深い位置にあるのですが、 /(php-src)/Zend/zend_compile.c void zend_do_echo(znode *arg TSRMLS_DC) void zend_do_print(znode *result, znode *arg TSRMLS_DC) /(php-src)/Zend/zend_execute.c case ZEND_ECHO: zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); case ZEND_PRINT: zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); /(php-src)/Zend/zend_variables.c ZEND_API int zend_print_variable(zval *var) { return zend_print_zval(var, 0); } /(php-src)/Zend/zend.c ZEND_API int zend_print_zval(zval *expr, int indent) { return zend_print_zval_ex(zend_write, expr, indent); } ZEND_API int zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int indent) 4.4.4ですが、このような流れになるのかと。。。 5.2.0は構造が変わってるので、まだ追え切れていないのですが、 /(php-src)/Zend/zend_compile.c void zend_do_echo(znode *arg TSRMLS_DC) void zend_do_print(znode *result, znode *arg TSRMLS_DC) /(php-src)/Zend/zend_vm_opcodes.h #define ZEND_ECHO 40 #define ZEND_PRINT 41 /(php-src)/Zend/zend_vm.h ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY) ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMP|VAR|CV, ANY) /(php-src)/Zend/zend_variables.c ZEND_API int zend_print_variable(zval *var) { return zend_print_zval(var, 0); } /(php-src)/Zend/zend.c ZEND_API int zend_print_zval(zval *expr, int indent) { return zend_print_zval_ex(zend_write, expr, indent); } 恐らく、このような流れになるのかと。。。中途半端でスミマセン。 > printfなどの標準関数はext/standard/以下に在るようですが。 > マニュアルには「正確には関数ではなく言語構造」とありますがどういうことでしょう? すみません。自分もヨク分かっていないのですが、PHPの言語としてみた時には echoは関数では無い(出力命令であるので関数としての使い方は出来ない)、と いう事が言いたいのかな、と個人的には思ってました。 php -r 'echo ( echo ( "1" ) );' http://jp2.php.net/echo ----------------------------------------------------------------------- echo() は実際には関数ではありません (言語構造です) 。 このため、使用する際に括弧は必要ありません。 (いくつかの他の言語構造と 異なり) echo() は関数のように動作しません。 そのため、 常に関数のコンテキスト中で使用することはできません。 加えて、複数のパラメータを指定して echo() をコールしたい場合、括弧の 中にパラメータを記述するべきではありません。 ----------------------------------------------------------------------- 言語構造 == (基本的な構文 + 型 + 変数 + 定数 + 式 + 演算子 + 制御構造) みたいな事なんじゃないのかと。。。 -- Seiji Masugata <s.masugata@...> _______________________________________________ PHP-dev mailing list PHP-dev@... http://ml.php.gr.jp/mailman/listinfo/php-dev |
|
|
[PHP-dev 1355] Re: echo,printの実装せとやまです。
(docメーリングリストの話題かもしれませんが、、、。) 言語構造は、原文では a language construct となっていますね。 ぐぐってみると、専門用語としては「言語機構」って訳されているみたいです。 (language structure の訳語が言語構造のよう) この用語、私は(専門教育受けてないので)知らなかったのですが、皆さんは知ってます? 06/12/14 に Seiji Masugata<s.masugata@...> さんは書きました: > こんばんわ、桝形です。 > > > 浅野です。 > > > > echo,printの処理はどこで行っているのでしょうか? > > 意外と深い位置にあるのですが、 > > /(php-src)/Zend/zend_compile.c > void zend_do_echo(znode *arg TSRMLS_DC) > void zend_do_print(znode *result, znode *arg TSRMLS_DC) > > /(php-src)/Zend/zend_execute.c > case ZEND_ECHO: > zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); > case ZEND_PRINT: > zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); > > /(php-src)/Zend/zend_variables.c > ZEND_API int zend_print_variable(zval *var) > { > return zend_print_zval(var, 0); > } > > /(php-src)/Zend/zend.c > ZEND_API int zend_print_zval(zval *expr, int indent) > { > return zend_print_zval_ex(zend_write, expr, indent); > } > > ZEND_API int zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int indent) > > > 4.4.4ですが、このような流れになるのかと。。。 > 5.2.0は構造が変わってるので、まだ追え切れていないのですが、 > > /(php-src)/Zend/zend_compile.c > void zend_do_echo(znode *arg TSRMLS_DC) > void zend_do_print(znode *result, znode *arg TSRMLS_DC) > > /(php-src)/Zend/zend_vm_opcodes.h > #define ZEND_ECHO 40 > #define ZEND_PRINT 41 > > /(php-src)/Zend/zend_vm.h > ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY) > ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMP|VAR|CV, ANY) > > > /(php-src)/Zend/zend_variables.c > ZEND_API int zend_print_variable(zval *var) > { > return zend_print_zval(var, 0); > } > > /(php-src)/Zend/zend.c > ZEND_API int zend_print_zval(zval *expr, int indent) > { > return zend_print_zval_ex(zend_write, expr, indent); > } > > 恐らく、このような流れになるのかと。。。中途半端でスミマセン。 > > > > printfなどの標準関数はext/standard/以下に在るようですが。 > > マニュアルには「正確には関数ではなく言語構造」とありますがどういうことでしょう? > > すみません。自分もヨク分かっていないのですが、PHPの言語としてみた時には > echoは関数では無い(出力命令であるので関数としての使い方は出来ない)、と > いう事が言いたいのかな、と個人的には思ってました。 > > php -r 'echo ( echo ( "1" ) );' > > http://jp2.php.net/echo > ----------------------------------------------------------------------- > echo() は実際には関数ではありません (言語構造です) 。 > > このため、使用する際に括弧は必要ありません。 (いくつかの他の言語構造と > 異なり) echo() は関数のように動作しません。 > > そのため、 常に関数のコンテキスト中で使用することはできません。 > 加えて、複数のパラメータを指定して echo() をコールしたい場合、括弧の > 中にパラメータを記述するべきではありません。 > ----------------------------------------------------------------------- > > 言語構造 == (基本的な構文 + 型 + 変数 + 定数 + 式 + 演算子 + 制御構造) > > みたいな事なんじゃないのかと。。。 > > -- > Seiji Masugata <s.masugata@...> > > _______________________________________________ > PHP-dev mailing list > PHP-dev@... > http://ml.php.gr.jp/mailman/listinfo/php-dev > PHP-dev mailing list PHP-dev@... http://ml.php.gr.jp/mailman/listinfo/php-dev |
| Free Forum Powered by Nabble | Forum Help |