问题标签 [spl]
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.
php - SPL 自动加载最佳实践
在服务器端的 include_path 中,我引用了 pear 目录,位于“/usr/share/pear/”中。在我的应用程序中,我包含来自公共库的文件,这些文件位于 '/usr/share/pear/library/' 中,带有require_once 'library/file.php'
.
我最近开始使用 spl 自动加载器,我注意到在加载器函数中你必须确定包含文件的逻辑。我这样做的第一种方法是尝试包含一个文件并抑制它@
以查看它是否会失败,例如,@include 'library/file.php'
但我认为主要是因为我阅读了很多关于@
这是一种不好的做法的信息,我决定自己手动完成这项工作get_include_path
。PATH_SEPARATOR
并查看目录是否是我想要的目录,然后执行file_exists
并包含它。
像这样:
我走错路了吗?我应该刚刚完成这项@include
业务,还是我在某种程度上朝着正确的方向做这件事?
php - 如何在 php 中创建具有重复键而不是默认哈希的数据结构?
我想创建包装类,它将启用密钥重复,而默认哈希不允许它。类应该使用php5中引入的成员重载机制,所以它会模仿标准hash的所有行为。例如,我想要 smth like
如果我想获取 $var['mykey'],它应该返回 array('val1', 'val2'),但是如果我想用新的 'mykey' => 'value' 对扩展 obj,我会调用
主要思想是保留了哈希的行为,并且在尝试使用现有密钥分配值之后,它不会被覆盖,而是附加到列表中。
您将如何模仿 php5(5.3 之前)中的其他数据结构?您是否有任何已知的解决方案或示例要分享?
php - 如何仅使用 PHP 迭代器执行选定的文件夹?
我正在尝试使用 PHP 递归目录迭代器来查找 php 和 html 文件,以便按日期列出这些文件。使用的代码如下:
以上工作,但我需要将迭代限制到某些文件夹。该脚本将在父文件夹中开始,我希望其中有一些特定的子文件夹,例如“管理员”、“组件”、“模块”、“插件”和“模板”(换句话说,Joomla 安装的标准文件夹)。我还希望父文件夹中有一些文件,例如“index.php”。这些文件和文件夹应该被迭代(坦率地说,写这个我不确定父文件夹本身是否被我的代码迭代!)。但是,父文件夹可能还包含不应迭代的其他子文件夹。这些可以是子域或插件域的子文件夹,例如命名为“mysub”和“myaddon.com”。除了正常的 Joomla 安装文件夹之外,我想跳过任何文件夹有两个原因。一是我不需要知道其他文件夹中的文件。此外,迭代所有文件夹可能会花费大量时间和资源,以至于我得到 500 个错误页面。
我的问题是如何最好地更改我的代码,以确保正确的文件夹被排除在迭代之外并包含在迭代中?我已经在网络上看到了检查目录名称的迭代器示例,但这对我帮助不够,因为我只需要检查二级文件夹名称(意味着只需要像 parent/secondlevel/noneedtocheck 这样的路径中的最高级别子文件夹/file.php)。
php - 如何使用 RegexIterator::REPLACE 模式?
我的代码有什么问题:
迭代器是空的,为什么?谢谢你的帮助!
php - PHP 中不一致的 DirectoryIterator+FilterIterator 行为?
我编写了一个使用来自标准 PHP 库 (SPL) 的 FilterIterator 类的脚本,并且我在 PHP 5.x 版本中得到了不同的行为:( 这里是 accept() 函数:
并继承其 PHP 5.3.1 的输出:
这是我在 PHP 5.2.5 下使用相同代码得到的结果
后者对所有文件拥有 755 权限。怎么回事?
php - (语法树)使用当前自上而下的路径自下而上递归迭代树
我有一个需要迭代的抽象语法树。AST 由柠檬移植到 PHP生成。
现在“通常”,我会使用全新的闪亮 (PHP 5.3.1) SPL 类,它看起来像这样:
实际上,这就是我已经在代码的另一部分中所做的,它确定了整个树的粗略类型(即它可以是赋值、条件等)。现在抛开细节不谈,唯一重要的是迭代是做RecursiveIteratorIterator::SELF_FIRST,也就是自顶向下。
回到我的问题,我需要自下而上地迭代 AST,即类似 RecursiveIteratorIterator::CHILD_FIRST 的东西,以便在树中进行一些替换和优化。
问题是,这些操作需要是上下文感知的,即我需要到当前节点的路径。而且由于我想自下而上迭代,所以我不能使用 RecursiveIteratorIterator。
好好想一想。我想自下而上迭代并在每次迭代时拥有当前节点的自上而下上下文(堆栈)。从技术上讲,它应该是可能的,因为 RecursiveIteratorIterator 必须首先到达树的尾部,才能向后迭代。在到达尾部的过程中,它可以缓存当前位置,并在从递归返回时简单地弹出元素。
现在这是一个关键字:缓存。这就是为什么我怀疑另一个 SPL 类应该是可能的:RecursiveCachingIterator。
问题是:真的有可能吗?如果是,如何?
我一直试图用一些代码来解决问题,但没有成功,而且文档很少。真的,真的很稀缺。
谁使用 SPL 找到了最优雅的解决方案,脱帽致敬!你是 PHP 大师!
PS:如果不清楚,我正在寻找尽可能多的 SPL(重新)使用。我知道我可以使用自定义堆栈编写自己的递归函数,无需提醒我。
php - PHP DirectoryIterator 帮助
在下面的代码中,可以调用什么来代替->getFilename()
?
PS,我看过文档。请不要链接到这里。
谢谢您的帮助。
编辑:
发布此消息后,我意识到文档有答案。我真正的问题是,其他方法有什么作用?文档似乎在这方面受到限制。
php - 将对象用作数组
在最近的 PHP 更新中,他们添加了各种接口以允许将对象视为数组,例如 ArrayAccess、Iterator、Countable 等。
我的问题是,以下是否可行:
截至目前,PHP 会引发类型提示错误,因为$array
从技术上讲它不是数组。但是,它实现了使其与数组基本相同的所有接口。
从逻辑上讲,该对象应该能够在任何可以使用数组的地方使用,因为它实现了与数组相同的接口。
我是否对我的逻辑感到困惑,或者如果一个对象实现与数组相同的接口,它应该能够在所有相同的地方使用是否有意义?
php - PHP < 5.2 的 spl_object_hash(对象实例的唯一 ID)
我正在尝试获取 PHP 5+ 中对象实例的唯一 ID。
该功能spl_object_hash()
可从 PHP 5.2 获得,但我想知道是否有适用于旧 PHP 版本的解决方法。
php.net 上的评论中有几个函数,但它们对我不起作用。第一个(简化):
不适用于本机对象(例如 DOMDocument),第二个:
看起来它可能是一个主要的性能破坏者!
有没有人袖手旁观?
php - Which PHP interface allows objects' properties to be accessible with array notation?
Which PHP SPL interface allows objects to do this:
e.g. such as in libraries like Doctrine (Doctrine_Record)
how do I implement this? I've tried using ArrayObject, but they don't behave as I thought they would.
i.e.
EDIT:
I tried a barebone implementation that I called Arrayable.