在某些其他语言(例如AS3)中,已经注意到如果像这样做var foo = []而不是var foo = new Array()出于对象创建和实例化的原因,初始化新数组会更快.我想知道PHP中是否有任何等价?
class Foo {
private $arr = array(); // is there another / better way?
}
Run Code Online (Sandbox Code Playgroud) 我喜欢在Perl中做这种事情:$foo = $bar || $baz分配$baz给$fooif $bar是空的还是未定义的.您还可以$foo ||= $bletch将只分配$bletch到$foo如果$foo没有定义或为空.
在这种情况下,三元运算符是乏味和乏味的.当然,PHP中有一个简单,优雅的方法?
或者是使用isset()的自定义函数的唯一答案?
我想更好地理解为什么在下面的场景中,类常量被继承的方式与实例变量的方式不同.
<?php
class ParentClass {
const TEST = "ONE";
protected $test = "ONE";
public function showTest(){
echo self::TEST;
echo $this->test;
}
}
class ChildClass extends ParentClass {
const TEST = "TWO";
protected $test = "TWO";
public function myTest(){
echo self::TEST;
echo $this->test;
}
}
$child = new ChildClass();
$child->myTest();
$child->showTest();
Run Code Online (Sandbox Code Playgroud)
输出:
TWO
TWO
ONE
TWO
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,ChildClass没有showTest()方法,因此继承使用ParentClass showTest()方法.结果显示,由于该方法在ParentClass上执行,因此正在评估TEST常量的ParentClass版本,而因为它通过继承在ChildClass上下文中进行评估,所以正在评估ChildClass成员变量$ test.
我已经阅读了文档,但似乎没有看到任何提及这种细微差别.任何人都可以为我解释一下吗?
Perl join()忽略(跳过)空数组值; PHP implode()似乎没有.
假设我有一个数组:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
Run Code Online (Sandbox Code Playgroud)
收益率:
one---four--six
Run Code Online (Sandbox Code Playgroud)
而不是(恕我直言):
one-four-six
Run Code Online (Sandbox Code Playgroud)
有我正在寻找的行为的任何其他内置插件?或者它是一个定制的工作?
我正在开发一个复杂的网站,它充分利用了jQuery和许多脚本.在加载网站时,我的脚本都没有工作(虽然我可以确认其他脚本运行正常).除了一件事,我不会在SE上发布这样一个蹩脚的问题:
我点击F12打开开发人员工具,以便我可以调试我的问题,一切都立即完美!
更糟糕的是,如果我关闭浏览器,启动它,首先打开Dev Tools并访问该站点,一切都按预期工作.
所以我甚至无法调试这个问题因为Dev Tools修复了它!Dev Tools可以做些什么让事情发挥作用?它是否改变了UA(我做了一些jQuery.browser检测)?它对doctype有用吗?
编辑
我的所有控制台日志记录都包含在以下包装器实用程序函数中:
function log(msg){
if (console){
console.log(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以尝试的任何想法或建议都会受到欢迎.如果我找到解决方案,我会在这里发布.
我正在设计一个类,它定义了一个高度复杂的对象,其中包含大量可选参数(50+),其中许多参数都有默认值(例如:) $type = 'foo'; $width = '300'; $interactive = false;.我正在尝试确定设置构造函数和实例/类变量的最佳方法,以便能够:
鉴于上述情况,我不想让构造函数传递大量的论据.我将传递一个包含初始化值的哈希,例如:$foo = new Foo(array('type'=>'bar', 'width'=>300, 'interactive'=>false));
在编写课程方面,我仍然觉得我宁愿......
class Foo {
private $_type = 'default_type';
private $_width = 100;
private $_interactive = true;
...
}
Run Code Online (Sandbox Code Playgroud)
...因为我相信这将有助于文档生成(您可以获得类属性的列表,这可以让API用户知道他们必须使用的'选项'),并且"感觉"就像正确的方法一样它.
但是你遇到了将构造函数中的传入参数映射到类变量的问题,并且在没有利用符号表的情况下,你进入了一种"暴力"的方法,这让我无法实现目的(尽管我对其他人开放)意见).例如:
function __construct($args){
if(isset($args['type'])) $_type = $args['type']; // yuck!
}
Run Code Online (Sandbox Code Playgroud)
我考虑过创建一个单独的类变量,它本身就是一个关联数组.初始化这将非常简单,例如:
private $_instance_params = array(
'type' => 'default_type',
'width' => 100,
'interactive' => true
);
function __construct($args){
foreach($args as $key=>$value){
$_instance_params[$key] = $value;
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎我没有利用私有类变量等本机功能,而且感觉文档生成不适用于这种方法.
感谢您阅读这篇文章; 我可能在这里问了很多,但我是PHP的新手,我真的只是寻找这种惯用/优雅的方式.你最好的做法是什么?
附录(有关此特定班级的详细信息) …
在升级到最新的TortoiseSVN并检查了一个repo后,NetBeans抱怨没有正确版本的SVN客户端.没问题,我下载的Win32SVN是1.7.0(乌龟是1.7.1,但这应该不是问题).
然后,在NetBeans中,我使用工具>选项>版本控制> Subversion将其指向subversion二进制文件.没有快乐.
每当我在NB中打开我的项目时,我都会收到一个可怕的警告DB告诉我,我需要降级我的仓库或升级我的SVN客户端.
我错过了哪些步骤?我不愿意降级我的TortoiseSVN,所以如何将NB带到鼻烟?
在iOS Safari中,单指平移在用户停止平移之前不会生成任何事件.仅当页面停止移动并重新绘制时才会生成onscroll事件.
我需要一种方法来检测实时滚动.具体来说,我想制作一个也适用于iOS Safari的粘性菜单.在非移动浏览器上,粘贴菜单可以通过在听取onscroll事件时在元素上的"position relative"到"position fixed"之间切换来完成.此方法不适用于移动浏览器,因为不会连续触发onscroll事件.我能做什么?
因此,您在外部.js文件中创建了一堆代码,该文件需要jQuery及其一些插件,或MooTools,或者可能是一些更深奥的库.显然,当你在每个脚本中加载时,实际的"include"是在HEAD部分的主机HTML页面中完成的.
但作为可移植性的最佳实践,您的JavaScript .js文件中存在哪些内置功能或广泛采用的约定,以确保使用您的代码的下一个schmoe还记住还包括其他所需的库?
我正在寻求开发者社区的一些共识,所以请务必投票选出最常见的或您最熟悉的答案.
我习惯了perl的map()函数,其中回调可以分配键和值,从而创建一个关联数组,其中输入是一个平面数组.我知道array_fill_keys()如果您只想创建一个字典样式的哈希,哪个可能很有用,但是如果您不一定希望所有值都相同呢?显然所有事情都可以通过foreach迭代来完成,但是还有其他(可能更优雅)的方法吗?
编辑:添加一个示例来阐明转换.请不要挂断转换,问题是将平面列表转换为哈希值,我们不能假设所有值都是相同的.
$original_array: ('a', 'b', 'c', 'd')
$new_hash: ('a'=>'yes', 'b'=>'no', 'c'=>'yes', 'd'=>'no')
*note: the values in this example are arbitrary, governed by some business logic that is not really relevant to this question. For example, perhaps it's based on the even-oddness of the ordinal value of the key
Run Code Online (Sandbox Code Playgroud)
实际示例 因此,使用此处提供的答案,以下是如何解析$ _POST以获取仅列出与给定条件匹配的输入字段的列表.这可能很有用,例如,如果表单中有很多输入字段,但必须同时处理它们中的某些组.
在这种情况下,我有许多输入字段,表示数据库的映射.每个输入字段如下所示:
<input name="field-user_email" value="2" />其中每种类型的字段都以"field-"为前缀.
我们想要做的是,首先,获取实际以"field-"开头的那些输入字段的列表,然后我们要创建一个名为的关联数组$mapped_fields,其中提取的字段名称作为键,实际输入字段的值作为价值.
$mapped_fields = array_reduce( preg_grep( '/field-.+/', array_keys( $_POST ) ), function( $hash, $field ){ $hash[substr( $field, 6 )] …Run Code Online (Sandbox Code Playgroud) php ×6
javascript ×3
array-map ×1
arrays ×1
class ×1
constants ×1
constructor ×1
conventions ×1
dependencies ×1
idioms ×1
implode ×1
inheritance ×1
ios ×1
netbeans ×1
onscroll ×1
oop ×1
operators ×1
overriding ×1
perl ×1
svn ×1