问题标签 [php-internals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
301 浏览

yacc - php 扩展中的 flex+bison

我使用 flex 和 bison 在 c 中创建了一个小型解析器。解析器将结果写入一些全局变量,调用函数从那里读取它。

我正在尝试将我的解析器打包为 php 扩展。根据我从 php 文档中了解到的情况,不建议使用真正的全局变量,因为它们不是线程安全的,我必须改用模块全局变量。

为了使用模块全局变量,您必须传入函数 TSRMLS_DC 作为其最后一个参数。

你知道我是否可以修改 yyparse 以接受 TSRMLS_DC 作为参数。或者如果有另一种访问全局变量的方法?

0 投票
2 回答
341 浏览

php-extension - 让 ZVAL 在 SAPI 中持久化?

ZVAL 通常是使用 emalloc 创建的,因此它在页面请求结束时被销毁。有没有办法获取现有的 ZVAL 并使其在 SAPI 中持续存在(相当于 pemalloc)?用 pemalloc 创建 ZVAL 怎么样?

理想情况下,我想做的(在 PHP 代码中)是这样的:

每个请求count都会返回 +1(假设每次都使用相同的 PHP“worker”——我使用的是 PHP-FPM)。

0 投票
7 回答
437685 浏览

php - PHP“foreach”实际上是如何工作的?

让我先说我知道foreach它是什么、做什么以及如何使用它。这个问题涉及它在引擎盖下是如何工作的,我不想要任何关于“这就是你如何循环数组foreach”的答案。


很长一段时间以来,我都认为这适用foreach于数组本身。然后我发现了很多关于它与数组的副本一起工作的事实,并且我认为这就是故事的结尾。但我最近开始讨论这个问题,经过一些实验后发现这实际上并不是 100% 正确的。

让我表明我的意思。对于以下测试用例,我们将使用以下数组:

测试用例 1

这清楚地表明我们没有直接使用源数组 - 否则循环将永远继续,因为我们在循环期间不断地将项目推入数组。但只是为了确保是这种情况:

测试用例 2

这支持了我们最初的结论,我们在循环期间使用源数组的副本,否则我们将在循环期间看到修改后的值。但...

如果我们查看手册,我们会发现以下语句:

当 foreach 首次开始执行时,内部数组指针会自动重置为数组的第一个元素。

对...这似乎表明foreach依赖于源数组的数组指针。但是我们刚刚证明了我们没有使用源数组,对吗?好吧,不完全是。

测试用例 3

因此,尽管我们不直接使用源数组,但我们直接使用源数组指针 - 指针位于循环末尾的数组末尾这一事实表明了这一点。除非这不可能是真的——如果是这样,那么测试用例 1将永远循环。

PHP手册还指出:

由于 foreach 依赖于内部数组指针,因此在循环内更改它可能会导致意外行为。

好吧,让我们找出“意外行为”是什么(从技术上讲,任何行为都是意外的,因为我不再知道会发生什么)。

测试用例 4

测试用例 5

...没有什么出乎意料的,实际上它似乎支持“源副本”理论。


问题

这里发生了什么?我的 C-fu 不足以让我仅仅通过查看 PHP 源代码就能得出正确的结论,如果有人能为我翻译成英文,我将不胜感激。

在我看来,它foreach适用于数组的副本,但在循环之后将源数组的数组指针设置为数组的末尾。

  • 这是正确的吗?
  • 如果不是,它到底在做什么?
  • 在任何情况下使用在 a 期间调整数组指针(等)的函数each()可能reset()foreach影响循环的结果?
0 投票
2 回答
521 浏览

php - 为 php5 扩展包装 c++ dll 的问题

我正在尝试为我的 c++ dll 创建 php 5.2.17 扩展。我在带有 Sambar Server 7.0 的 windows xp 上使用 Visual Studio 2005。我有两个问题:

  1. 我无法在我的代码中包含 c++ 的东西(字符串或 STL 映射)。它给出的错误如下:“PHP 在 00CF421B 遇到访问冲突”。如何在我的 dll 中使用字符串和 STL 映射。

  2. 我正在尝试创建一个 c++ dll,其中包含一个具有 3 个字符串类型参数的函数并返回这 3 个字符串的第二个字符串。

下面是代码:

php 文件包含:

-> 当为此函数设置了两个参数时,这里的第一个字符串返回正常。

-> 当试图为这个函数返回带有两个参数的第二个字符串时,我收到一个错误:“PHP 在 014AE07C 遇到访问冲突”

-> 当尝试使用上述代码之类的 3 个参数时,我的 sambar 服务器会自行关闭.. 没有机会看到输出。

为什么会出现这种奇怪的行为,我哪里出错了?

提前致谢

阿尼尔

0 投票
3 回答
4455 浏览

php - PHP 字符串长度

PHP编码标准说:

... PHP 拥有每个字符串的长度属性,它不应该用 strlen() 来计算。以这样一种方式编写你的函数,以便它们能够利用长度属性,既是为了提高效率,也是为了使它们是二进制安全的。...

如何访问此长度属性?还是我误解了?

0 投票
1 回答
483 浏览

php - Zend引擎调用父方法

我现在正在尝试创建一个自定义 php 扩展,我面临的一个问题是我不知道如何调用父方法。

就好比在类的构造函数中,调用父类的构造函数:

如何正确执行此操作?

0 投票
1 回答
1025 浏览

php - 如何将 zval 转换为向量以进行 php 扩展?

我正在为我的 c++ 库编写一个 php 扩展,它的定义如下:

现在,我正在为上述函数编写一个 php 包装器,如下所示。

现在我想调用 getPids(),但我不知道将 idsArray 作为向量传递给 c++ 函数的正确方法。

在网上搜索后,我找到了一个迭代 zval 数组以读取每个值的示例,我想也许我可以使用它来创建一个向量。

但这是最好的方法吗?还是有更好的方法来做到这一点?

谢谢!

0 投票
1 回答
421 浏览

php - zend engine return object reference

In php, it is valid to write something like this:

How can I do this inside zend engine? I want a method to execute some operations, then return the class instance reference.

Furthermore, I would like to store some objects (from other classes) and return them as result of some other methods, should i store it's zval*? What is the right way to return a reference to it?

0 投票
1 回答
1086 浏览

php - SplObjectStorage::contains 和 SplObjectStorage::offsetExists 有什么区别?

PHP 文档不是很明确,只声明:

SplObjectStorage::offsetExists 检查存储中是否存在对象。(PHP >= 5.3.0)

SplObjectStorage::contains 检查存储是否包含提供的对象。(PHP >= 5.1.0)

这对我来说几乎是一样的。

问题:除了 offsetExists 仅在 5.3.0 中可用之外,两者之间有什么区别?


我进行的小测试...

输出:

0 投票
1 回答
241 浏览

php - 由于 ZEND_NUM_ARGS() 宏而无法构建扩展

我正在编写小型 php 扩展并且在构建它时遇到问题。编码:

在 make 上出现错误:

ZEND_NUM_ARGS() 是 Zend_API.h 中的一个宏

但什么是'ht'?有任何想法吗?