我正在浏览php-src/Zend/zend_API.c,但在任何地方都找不到PHP 中该函数的源代码strlen()。搜索代码库并没有真正的帮助,因为到处都是 libc strlen。谷歌搜索也没有太大帮助。
我尝试使用Vulcan Logic Dumper扩展来检查引擎盖下发生的事情。
我尝试了以下代码作为测试:
<?php
strlen("foo"); strpos("foo", "f");
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
寻找切入点
来自位置的分支分析:0
发现 1 次跳跃。(代码 = 62)位置 1 = -2
文件名:/tmp/test.php
函数名:(空)
操作数:7
编译变量:无
行 #* EIO op fetch ext 返回操作数
-------------------------------------------------- ---------------------
3 0 E > 回声 3
4 1 INIT_FCALL 'strpos'
2 SEND_VAL '富'
3 SEND_VAL 'o'
4 DO_CALL $0
5 回声 $0
6 > 返回 1
注意如何strpos()显示为函数调用,而不是strlen(). 所以我尝试了这个(顺便说一下,这是在 PHP 7.4 上 …
编辑:修改我的问题
在C中构建外部PHP模块时,如何链接共享对象?
只是浏览PHP编码标准的最新版本,有些东西引起了我的注意:
http://svn.php.net/viewvc/php/php-src/trunk/CODING_STANDARDS?revision=296679&view=markup
编码标准#4声明"在编写处理字符串的函数时,请务必记住PHP保存每个字符串的长度属性,并且不应该使用strlen()计算..."
我总是使用strlen,也许它已经晚了,但是如何在PHP中访问字符串的内置长度属性?
这些函数的编写方式与用户函数相同吗?我的意思是PHP代码和正则表达式和类似的东西?
例如:
filter_var($email, FILTER_VALIDATE_EMAIL);
与
http://www.totallyphp.co.uk/code/validate_an_email_address_using_regular_expressions.htm
PHP array_keys如何搜索值?
例:
$array2 = array("xyz", "xyz", "abc", "abc", "xyz", "xyz", "text", "abc", "text");
print_r(array_keys($array2,"abc"));
Run Code Online (Sandbox Code Playgroud)
因为它们是关键的,价值对.我猜PHP是基于哈希进行搜索而不是遍历数组中的每个密钥对.
对此有何"清晰的想法"?
受这个问题启发的问题:如果类似大小的数组中的相应元素是一个数字(没有迭代),如何获取数组中空元素的键?
我做了一个php扩展,看起来像:
PHP_FUNCTION(function_name)
{
...
proc_data = ( char * )malloc(length);
...
RETURN_STRINGL( proc_data, length, 1 );
}
Run Code Online (Sandbox Code Playgroud)
function_name是php代码中可用的函数,它返回一个字符串.但是这个字符串是使用malloc分配内存的,它会自动释放还是我要对它做些什么.我知道emalloc,但如果我使用它会有什么不同?
有没有更好的方法呢?
在将PHP源代码转换为操作码之前,是否存在消除死条件的优化过程?
例:
<?php
if (false) {
echo 'false';
}
echo 'true';
Run Code Online (Sandbox Code Playgroud)
它变成了echo 'true';吗?
如果答案是肯定的,PHP可以处理以下哪种情况?
if(false); //Explicit boolean
$true = true; if($true); //Variable that was assigned a constant boolean
if(ClassName::Constant); //Class constant
if(1>2); //Constant value expression
Run Code Online (Sandbox Code Playgroud)
如果有版本特定的差异,请慷慨.
以下哪一项会使用更少的内存?
$myArray = array();
$myArray[1] = array(1,2,3,4,5,6,7,8,9,10);
$myArray[2] = array(1,2,3,4,5,6,7,8,9,10);
$myArray[3] = array(1,2,3,4,5,6,7,8,9,10);
Run Code Online (Sandbox Code Playgroud)
要么
$myArray = array();
$myArray[1] = array(1,2,3);
$myArray[2] = array(1,2,3);
$myArray[3] = array(1,2,3);
$myArray[4] = array(1,2,3);
$myArray[5] = array(1,2,3);
$myArray[6] = array(1,2,3);
$myArray[7] = array(1,2,3);
$myArray[8] = array(1,2,3);
$myArray[9] = array(1,2,3);
$myArray[10] = array(1,2,3);
Run Code Online (Sandbox Code Playgroud)
array(1,2,3,4,5,6,7,8,9,10)并且array(1,2,3)可能不会在真实场景中重复.
如果我在CPU和内存利用率方面使用其他产品,那么性能会有提升吗?
在PHP中,您可以使用数组语法来访问字符串索引.以下程序
<?php
$foo = "Hello";
echo $foo[0],"\n";
?>
Run Code Online (Sandbox Code Playgroud)
回声
H
Run Code Online (Sandbox Code Playgroud)
但是,如果您访问零长度字符串的第一个字符
<?php
$bar = "";
$bar[0] = "test";
var_dump($bar);
?>
Run Code Online (Sandbox Code Playgroud)
PHP将您的字符串转换为数组.上面的代码产生
array(1) {
[0] =>
string(4) "test"
}
Run Code Online (Sandbox Code Playgroud)
即我的零长度字符串被强制转换为数组.类似的"访问字符串的未定义索引"示例不会产生此转换行为.
$bar = " ";
$bar[1] = "test";
var_dump($bar);
Run Code Online (Sandbox Code Playgroud)
生成字符串t.即$bar保持字符串,并且不会转换为数组.
当语言需要推断和/或自动为你投射变量时,我会发现这些不直观的边缘情况是不可避免的,但有谁知道幕后发生了什么?
即在PHP中的C/C++级别发生了什么来实现这一点.为什么我的变量变成了一个数组.
PHP 5.6,如果重要的话.
我只是在试验PHP扩展,我想知道在扩展中调用对象构造函数的建议/首选方法是什么.我已经读过,通过调用object_init_ex函数,不会自动调用该对象的构造函数.从我所做的测试来看,这似乎也是正确的.我们假设我有以下代码,其中'Person'是有效的类名:
zend_class_entry *class_entry = NULL;
zend_string *class_name = zend_string_init("Person", sizeof("Person") - 1, false);
class_entry = zend_lookup_class(class_name);
if (class_entry != NULL) {
object_init_ex(return_value, class_entry);
/* call the Person::_construct method */
} else {
RETURN_NULL();
}
Run Code Online (Sandbox Code Playgroud)
如何在object_init_ext调用后调用构造函数?另外,在这方面,php 5和php 7之间会有什么区别吗?
php ×10
php-internals ×10
strlen ×2
arrays ×1
automake ×1
c++ ×1
casting ×1
coding-style ×1
filter-var ×1
function ×1
object ×1
types ×1