58-定义函数的过程
58-定义函数的过程
在PHP中,用户函数的定义从function关键字开始。如下所示简单示例:
<code>function foo($var) { echo $var; } </code>
这是一个非常简单的函数,它所实现的功能是定义一个函数,函数有一个参数,函数的内容是在标准输出端输出传递给它的参数变量的值。
函数的一切从function开始。我们从function开始函数定义的探索之旅。
词法分析
在 Zend/zend_language_scanner.l中我们找到如下所示的代码:
<code>"function" { return T_FUNCTION; } </code>
它所表示的含义是function将会生成T_FUNCTION标记。在获取这个标记后,我们开始语法分析。
语法分析
在 Zend/zend_language_parser.y文件中找到函数的声明过程标记如下:
<code>function: T_FUNCTION { $$.u.opline_num = CG(zend_lineno); } ; is_reference: /* empty */ { $$.op_type = ZEND_RETURN_VAL; } | '&' { $$.op_type = ZEND_RETURN_REF; } ; unticked_function_declaration_statement: function is_reference T_STRING { zend_do_begin_function_declaration(&$1, &$3, 0, $2.op_type, NULL TSRMLS_CC); } '(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$1 TSRMLS_CC); } ; </code>
关注点在 function is_reference T_STRING,表示function关键字,是否引用,函数名。
T_FUNCTION标记只是用来定位函数的声明,表示这是一个函数,而更多的工作是与这个函数相关的东西,包括参数,返回值等。
生成中间代码
语法解析后,我们看到所执行编译函数为zend_do_begin_function_declaration。在 Zend/zend_complie.c文件中找到其实现如下:
<code>void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC) /* {{{ */ { ...//省略 function_token->u.op_array = CG(active_op_array); lcname = zend_str_tolower_dup(name, name_len); orig_interactive = CG(interactive); CG(interactive) = 0; init_op_array(&op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE TSRMLS_CC); CG(interactive) = orig_interactive; ...//省略 if (is_method) { ...//省略 类方法 在后面的类章节介绍 } else { zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_DECLARE_FUNCTION; opline->op1.op_type = IS_CONST; build_runtime_defined_function_key(&opline->op1.u.constant, lcname, name_len TSRMLS_CC); opline->op2.op_type = IS_CONST; opline->op2.u.constant.type = IS_STRING; opline->op2.u.constant.value.str.val = lcname; opline->op2.u.constant.value.str.len = name_len; Z_SET_REFCOUNT(opline->op2.u.constant, 1); opline->extended_value = ZEND_DECLARE_FUNCTION; zend_hash_update(CG(function_table), opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)); } } /* }}} */ </code>
生成的中间代码为 ZEND_DECLARE_FUNCTION ,根据这个中间代码及操作数对应的op_type。 我们可以找到中间代码的执行函数为 ZEND_DECLARE_FUNCTION_SPEC_HANDLER。
在生成中间代码时,可以看到已经统一了函数名全部为小写,表示函数的名称不是区分大小写的。
为验证这个实现,我们看一段代码:
<code>function T() { echo 1; } function t() { echo 2; } </code>
执行代码,可以看到屏幕上输出如下报错信息:
<code>Fatal error: Cannot redeclare t() (previously declared in ...) </code>
表示对于PHP来说T和t是同一个函数名。检验函数名是否重复,这个过程是在哪进行的呢? 下面将要介绍的函数声明中间代码的执行过程包含了这个检查过程。
执行中间代码
在 Zend/zend_vm_execute.h 文件中找到 ZEND_DECLARE_FUNCTION中间代码对应的执行函数:ZEND_DECLARE_FUNCTION_SPEC_HANDLER。 此函数只调用了函数do_bind_function。其调用代码为:
<code>do_bind_function(EX(opline), EG(function_table), 0); </code>
在这个函数中将EX(opline)所指向的函数添加到EG(function_table)中,并判断是否已经存在相同名字的函数,如果存在则报错。 EG(function_table)用来存放执行过程中全部的函数信息,相当于函数的注册表。 它的结构是一个HashTable,所以在do_bind_function函数中添加新的函数使用的是HashTable的操作函数zend_hash_add。
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });以上就介绍了58-定义函数的过程,包括了定义,过程方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Fungsi bermaksud fungsi. Ia adalah blok kod yang boleh digunakan semula dengan fungsi tertentu Ia boleh menerima parameter input, melakukan operasi tertentu, dan mengembalikan hasil daripada blok yang boleh digunakan semula. kod untuk meningkatkan kebolehgunaan semula dan kebolehselenggaraan kod.

OPStack ialah rangka kerja blockchain sumber terbuka yang dikeluarkan oleh Optimism Collective, kumpulan pembangunan di sebalik Optimism Network. Ia adalah alat penting untuk kedua-dua komuniti Ethereum dan Optimisme. Matlamat utama OPStack adalah untuk mengukuhkan Rangkaian Optimisme, menyediakan alatan perisian utama kepada Optimisme Mainnet, serta Optimisme Superchain yang akan datang dan model tadbir urusnya. Dengan menyediakan persekitaran berorientasikan pembangun, idea teras OPStack adalah untuk menggalakkan pertumbuhan dan inovasi dalam ruang Ethereum. Ia membuka jalan untuk pembangunan termaju dan menjadikan penciptaan blockchain lebih mudah. OPStac

Sebelum ini, Optimisme secara rasmi mengumumkan bahawa rantai Optimisme telah ditukar nama kepada OPMainnet Mungkin ada yang bertanya apakah rantai OPMainnet? Menurut maklumat semasa, OPMainnet ialah rantaian super sumber terbuka yang didedikasikan untuk membiayai barangan awam dengan cara yang mampan Ia adalah salah satu daripada banyak rantaian L2 yang boleh berkomunikasi dengan lancar dengan Base, ZoraNetwork, PGN, Redstone dan rantaian lain, tetapi ia tidak. bukan satu blok, ia mewakili dua puluh keseluruhan rangkaian super rantai. Editor di bawah akan bercakap tentang OPMainnet ini secara terperinci untuk membantu anda memahami rangkaian OPMainnet. Apakah rantai OPMainnet? OPmainnet ialah Ethernet

Rangka kerja pelaksanaan PHP: Tutorial pengenalan ZendFramework ZendFramework ialah rangka kerja tapak web sumber terbuka yang dibangunkan oleh PHP dan kini diselenggara oleh ZendTechnologies menggunakan corak reka bentuk MVC dan menyediakan satu siri perpustakaan kod boleh guna semula untuk melaksanakan aplikasi Web2.0 dan Web Serve. ZendFramework sangat popular dan dihormati oleh pembangun PHP dan mempunyai pelbagai jenis

Cara menggunakan ACL (AccessControlList) untuk kawalan kebenaran dalam Rangka Kerja Zend Pengenalan: Dalam aplikasi web, kawalan kebenaran ialah fungsi penting. Ia memastikan bahawa pengguna hanya boleh mengakses halaman dan ciri yang dibenarkan untuk mereka akses dan menghalang akses yang tidak dibenarkan. Rangka kerja Zend menyediakan cara yang mudah untuk melaksanakan kawalan kebenaran, menggunakan komponen ACL (AccessControlList). Artikel ini akan memperkenalkan cara menggunakan ACL dalam Rangka Kerja Zend

Dalam artikel ini, kita akan belajar tentang fungsi enumerate() dan tujuan fungsi "enumerate()" dalam Python. Apakah fungsi enumerate()? Fungsi enumerate() Python menerima pengumpulan data sebagai parameter dan mengembalikan objek penghitungan. Objek penghitungan dikembalikan sebagai pasangan nilai kunci. Kuncinya ialah indeks yang sepadan dengan setiap item, dan nilainya ialah item. Syntax enumerate(iterable,start) Parameters iterable - Yang diluluskan dalam pengumpulan data boleh dikembalikan sebagai objek enumeration, dipanggil iterablestart - Seperti namanya, indeks permulaan objek enumeration ditakrifkan oleh permulaan. kalau kita abaikan

Penjelasan terperinci tentang peranan dan fungsi jadual MySQL.proc ialah sistem pengurusan pangkalan data relasi yang popular Apabila pembangun menggunakan MySQL, mereka sering melibatkan penciptaan dan pengurusan prosedur tersimpan (StoredProcedure). Jadual MySQL.proc ialah jadual sistem yang sangat penting Ia menyimpan maklumat yang berkaitan dengan semua prosedur tersimpan dalam pangkalan data, termasuk nama, definisi, parameter, dsb. prosedur tersimpan. Dalam artikel ini, kami akan menerangkan secara terperinci peranan dan kefungsian jadual MySQL.proc

Penggunaan dan Fungsi Fungsi Vue.use Vue ialah rangka kerja bahagian hadapan yang popular yang menyediakan banyak ciri dan fungsi berguna. Salah satunya ialah fungsi Vue.use, yang membolehkan kami menggunakan pemalam dalam aplikasi Vue. Artikel ini akan memperkenalkan penggunaan dan fungsi fungsi Vue.use dan memberikan beberapa contoh kod. Penggunaan asas fungsi Vue.use adalah sangat mudah, cuma panggilnya sebelum Vue diwujudkan, menghantar pemalam yang anda ingin gunakan sebagai parameter. Berikut ialah contoh mudah: //Perkenalkan dan gunakan pemalam
