PHP的隐藏功能?
作者:mobiledu2402851323 | 2023-09-05 17:00
如何解决《PHP的隐藏功能?》经验,为你挑选了49个好方法。
我知道这听起来像是一个让人尴尬的问题,但让我解释一下我来自哪里.
大学毕业后,我在PHP商店找到了一份工作.我在那里工作了一年半,并且认为我已经学到了所有有关编程的知识.
然后我在一家规模庞大的公司找到了一份单人内部开发工作室,所有工作都在C#中.在我对这个职位的承诺中,我开始阅读大量的博客和书籍,并很快意识到我认为我知道一切都是错的.我学习了单元测试,依赖注入和装饰模式,松散耦合的设计原则,继承辩论的组合等等 - 我仍然非常吸收它.毋庸置疑,我的编程风格在去年完全改变了.
现在我发现自己正在为一个朋友的初创公司做一些编码的PHP项目,我觉得完全受限制而不是用C#编程.让我感到困扰的是,必须通过追加'$ this->'来引用类范围内的所有变量.令我很生气的是,我尝试过的IDE中没有一个具有非常好的智能感知,而且我的SimpleTest单元测试方法必须从"测试"一词开始.令我疯狂的是,动态类型使我无法隐式指定方法所期望的参数类型,并且必须编写switch语句来执行方法重载.我不能忍受你不能拥有嵌套的命名空间,并且必须使用::运算符来调用基类的构造函数.
现在我无意启动PHP与C#的争论,而我的意思是说我确定有些PHP功能我不知道或者知道但是没有正确使用.我被置于我的C#宇宙中,无法看到玻璃碗外面.
所以我问,你最喜欢的PHP功能是什么?你可以做些什么,你不能或在.Net语言中更难?
1> Kyle Cronin..: 文档 .该文件得到我的投票.我还没有遇到过更完整的编程语言在线文档 - 我需要从各种网站和手册页拼凑起来.
我同意.能够输入www.php.net/function_name并在大多数时间获得参考是很好的.
我也同意.关于手册最棒的是用户评论.我很少看到其他文件有这些.它们可以包含真正的宝石.唯一的缺点是恕我直言他们很快就被修剪了.
@Phoexo"有点不那么可读"??? 我从来没有理解,也永远不会理解MSDN,而PHP文档很简单明了.
不同意.文档"好"的唯一原因是因为一些用户评论堵塞了官方笔记中的所有漏洞.
2> user8134..: 数组 .从这个问题的答案来看,我不认为人们完全理解PHP中的数组是多么简单和有用.PHP数组同时充当列表,映射,堆栈和通用数据结构.数组在语言核心中实现,并在整个地方使用,从而产生良好的CPU缓存局部性.Perl和Python都对列表和映射使用单独的语言结构,导致更多的复制和可能令人困惑的转换.
我最初从PHP转向C#几乎杀了我.在C#中,数组只是一个具有静态大小和数字索引的简单结构.在PHP中,数组是宇宙的胶带!
另一方面,数组的语法完全糟糕.在许多脚本语言中,您可以创建一个简单的2D数组,如下所示:`[[1,2],[3,4]]`,将其与PHP版本进行比较:`array(array(1,2),array(3) ,4))`.
PHP数组元素是有序的.
我确定php数组很棒,但是对于敲响C#数组的评论有40票?如果C#数组不适合需要,有很多选项.ArrayList和泛型集合都非常强大.有许多类型的集合可满足特定需求.在这方面,php的唯一实际*优势*是它不提供程序员必须决定的任何选项.您要么使用数组,要么没有可索引的变量.
我也同意.在使用Java进行Uni任务时,我惊讶于它们有多么僵硬,没有任何灵活性.真的让我欣赏PHP阵列有多好.
实际上,PHP数组的灵活性以及接口ArrayAccess和Iterator以及Countable(创建一个可以像数组一样使用的类)使我的生活变得如此简单,因为在没有任何事情的情况下执行某些任务会更加困难.
@gWiz:同意了.不清楚为什么C#的数组不会成为ArrayList,Dict或HashTable.仅仅因为它在一种语言中以这种方式工作并不意味着它应该在其他地方.也就是说,每次因为同样的原因我不得不从PHP切换回来时,我常常诅咒ASP.
您正在比较静态和动态语言,并抱怨您没有使用静态语言获得动态语言的好处,而没有考虑动态语言的缺点.我属于动态语言阵营,更喜欢PHP的方法,但它并没有成为一种真正的方式.
3> Allain Lalon..: 流处理程序 允许您使用逻辑扩展"FileSystem",据我所知,在大多数其他语言中很难做到这一点.
例如,使用MS-Excel Stream处理程序,您可以通过以下方式创建MS Excel文件:
$fp = fopen("xlsfile://tmp/test.xls", "wb");
if (!is_resource($fp)) {
die("Cannot open excel file");
}
$data= array(
array("Name" => "Bob Loblaw", "Age" => 50),
array("Name" => "Popo Jijo", "Age" => 75),
array("Name" => "Tiny Tim", "Age" => 90)
);
fwrite($fp, serialize($data));
fclose($fp);
具有适当的OO方法的恕我直言将比流处理程序的混乱更加明智.是的,能够读取/写入Excel文件很可爱,但是它必须像这样工作吗?
如果您正在使用Amazon S3,请查看Zend_Amazon_S3,它为"s3:// {bucket-name}/path"等网址提供流接口.
也许是这样,但是这种方法将复杂性封装在大多数PHP开发人员通用的界面中......而不需要他们学习可能超出他们的面向对象的概念.
4> Allain Lalon..: Magic Methods 是一种直通方法,只要您调用不存在的方法或分配或读取不存在的属性,就会调用它们.
interface AllMagicMethods {
// accessing undefined or invisible (e.g. private) properties
public function __get($fieldName);
public function __set($fieldName, $value);
public function __isset($fieldName);
public function __unset($fieldName);
// calling undefined or invisible (e.g. private) methods
public function __call($funcName, $args);
public static function __callStatic($funcName, $args); // as of PHP 5.3
// on serialize() / unserialize()
public function __sleep();
public function __wakeup();
// conversion to string (e.g. with (string) $obj, echo $obj, strlen($obj), ...)
public function __toString();
// calling the object like a function (e.g. $obj($arg, $arg2))
public function __invoke($arguments, $...);
// called on var_export()
public static function __set_state($array);
}
这里的C++开发人员可能会注意到,PHP允许重载某些运算符,例如()
或(string)
.实际上PHP允许重载甚至更多,例如[]
运算符(ArrayAccess),foreach
语言构造(Iterator和IteratorAggregate)和count
函数(Countable).
PHP的这种功能的实现比其他语言弱,这一事实并没有使它在PHP中变得不那么有用.
神奇的方法也很慢.仔细使用它们.
不同意.这远比Smalltalk,Ruby和Python中的类似工具弱(并且可能是从其中一个复制)
作为使用魔术方法可以实现的有用示例,请转到http://phpcodetips.blogspot.com/2008/07/domain-model-validation.html
`__call()`在使用map domain.com/controller/method/的框架中很棒
5> Dean Rather..: 该标准类 是一个整洁的容器.我最近才了解它.
而不是使用数组来保存多个属性
$person = array();
$person['name'] = 'bob';
$person['age'] = 5;
您可以使用标准类
$person = new stdClass();
$person->name = 'bob';
$person->age = 5;
在字符串中访问这些变量时,这尤其有用
$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string = "$person->name is $person->age years old.";
我们讨论的主题是:(对象)数组("name"=>'bob','age'=> 5)
"{$ person ['name']}是{$ person ['age']}岁"的作品.
@majelbstoat:取出引号会降低脚本的速度,因为PHP解释器会查看是否已使用define(...)设置'name'和'age'.考虑到可以完全翻转每种情况下访问的密钥,这也是一种不好的做法:define('age','name'); 定义( '名', '年龄');
"人[姓名]是$ person [年龄]岁"也会工作......没有报价,没有大括号:)
$ string = sprintf("%s是%d岁.",$ person ['name'],$ person ['age']);
@brianreavis和@Frank Farmer事实并非如此.由于字符串中没有花括号,因此PHP将大括号中的内容视为文字.例如:"$ person [name]"相当于"{$ person ['name']}" - 在任何一种情况下,PHP都不会考虑名称来引用常量.请参阅PHP手册中"变量解析"下的类型 - >字符串.
@WilliSchönborn:当然,性能方面可能并不重要,但考虑到每当PHP遇到其中一个时抛出E_NOTICE的事实,它只是简单的草率.
6> Philippe Ger..: 包含文件可以具有 可以分配给变量的返回值 .
// config.php
return array(
'db' => array(
'host' => 'example.org',
'user' => 'usr',
// ...
),
// ...
);
// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org
@fabrik因为它是全局变量并且在整个主范围内可用.这是非常不愉快的,这是更好的方式.
7> Michał Tatar..: 您可以利用or
运算符优先级低于=
执行此操作的事实:
$page = (int) @$_GET['page']
or $page = 1;
如果第一个赋值的值的计算结果为true
,则忽略第二个赋值.另一个例子:
$record = get_record($id)
or throw new Exception("...");
@Pies:一种方式是以下,相当凌乱的代码说实话:$ page = isset($ _ GET ['page'])?(int)$ _ GET ['page']:1; //这样做的好处是不需要进行错误抑制.
我觉得我不太相信这一点; 即使它看起来不容易出错,但它反直觉,而这本身可能会导致错误.
值得注意的是,如果`或`之前的代码导致数值'0',则`或`之后的代码将执行.所以在语义上它可能不太像"$ _GET ['page']`这样的东西,但显然情况可能会出现并且值得注意.
在第二个想法,因为你正在寻找一个你可以使用的整数:$ page = is_int($ _ GET ['page'])?$ _GET ['page']:1;
值得注意的是,`或'运算符是`||'运算符的较低先例版本.此外,+1因为这是高度表达,我经常忘记它是可能的.它应该更频繁地使用,并且它的作用绝对清楚.我不知道"真正的男性"代码如何,所以我不能对此发表评论.
8> Willem..: __autoload()
(类)文件辅助set_include_path()
.
在PHP5中,现在不需要在执行合适的OOP时指定"include_once"语句的长列表.
只需定义一小组目录,其中类库文件结构合理,并设置自动包含路径:
set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`
现在__autoload()
例程:
function __autoload($classname) {
// every class is stored in a file "libs/classname.class.php"
// note: temporary alter error_reporting to prevent WARNINGS
// Do not suppress errors with a @ - syntax errors will fail silently!
include_once($classname . '.class.php');
}
现在,PHP将按需自动包含所需的文件,从而节省解析时间和内存.
当然!__autoload()是PHP4,但spl_autoload_register()是自动加载方法的非破坏性"菊花链".
一个方便的功能,但有一点需要注意的是,当您找到给定类的实例时,它会使查找类文件的位置变得更加困难.在顶部明确定义包含为您提供有限列表的相关类及其确切位置.
在实施自动加载时,请查看来自PHP标准工作组(包括ZF,Symfony,Doctrine,CakePHP,Solar等开发人员)的PSR-0道具:http://groups.google.com/group/php -standards /网络/ PSR-0,最终建议
9> Jrgns..: 变量和函数 毫无疑问!
$foo = 'bar';
$bar = 'foobar';
echo $$foo; //This outputs foobar
function bar() {
echo 'Hello world!';
}
function foobar() {
echo 'What a wonderful world!';
}
$foo(); //This outputs Hello world!
$$foo(); //This outputs What a wonderful world!
相同的概念适用于对象参数($ some_object - > $ some_variable);
非常非常棒.使用循环和模式进行编码非常简单,并且它比eval更快,更易于控制(Thanx @Ross和@Joshi Spawnbrood!).
变量实际上使代码更不易读,更容易出错.
变量是PHP提供的最差特性之一.
9在10次中,变量变量最好用数组替换,这样你就可以将所有数据放在一个地方,你可以迭代它等等.只有在某些非常具体的情况下它们才有用.
人们真的用这个吗?男人,我讨厌阅读这些来源.
请不要让新手使用那个"功能".
喜欢这些!花了几分钟让我困惑,多年掌握.
通过更大的灵活性,您将拥有更多的复杂性.但也更灵活:)
10> Chris Rideno..: 容易 .最大的特点是新开发人员坐下来编写"工作"脚本并理解代码是多么容易.
最糟糕的特性是新开发人员坐下来编写"工作"脚本并认为他们理解代码是多么容易.
围绕PHP 的社区 的开放性 和作为开源的大量PHP项目对于进入开发领域的人来说并不像你一样令人生畏,可以成为更成熟语言的踏脚石.
我不会在我之前讨论技术问题,但如果你把PHP视为一个社区而不是一个网络语言,一个在你开始开发时明显拥抱你的社区,那么这些好处确实可以说明问题.
绝对是一个很好的评论.Python是我的第一语言,它很棒,但缺乏我觉得能够理解的项目确实造成了障碍.使用PHP,我可以查看文档中的任何内容并找出答案...... Web上可用的资源非常棒.
11> TheBrain..: 您可以使用功能与参数的不确定数量的 使用func_get_args()
.
12> zombat..: 我喜欢远程文件 .对于Web开发,此类功能非常有用.
需要使用网页的内容?一个简单的
$fp = fopen('http://example.com');
并且你已经准备好了文件句柄,就像任何其他普通文件一样.
或者如何直接读取字符串中的远程文件或网页?
$str = file_get_contents('http://example.com/file');
这种特殊方法的用处很难夸大.
想分析远程图像?怎么样通过FTP做到这一点?
$imageInfo = getimagesize('ftp://user:password@ftp.example.com/image/name.jpg');
几乎所有使用文件的PHP函数都可以使用远程文件.你甚至可以include()
和require()
代码远程文件这种方式.
"你甚至可以通过这种方式远程包含()或require()代码文件." 当然,在你无法控制的服务器上包含()文件是一个可怕的,可怕的想法.
@Frank - 是的,好吧,有人会认为你会包含来自你控制的服务器的代码.
这太好了!要在例如Java中执行此操作,您需要包含大量的jar文件,而不是编写大量的样板代码.
13> thomasrutter..: strtr函数的效率()
它非常快,你会感到惊讶.在内部,它可能使用一些疯狂的b树类型结构来按照它们的公共前缀排列匹配.我使用超过200个查找和替换字符串,它仍然在不到100毫秒内通过1MB.除了琐碎的小字符串之外,strtr()在执行完全相同的操作时甚至比strtolower()明显更快,甚至考虑到字符集.您可以使用连续的strtr调用编写一个完整的解析器,它比通常的正则表达式匹配更快,找出令牌类型,输出这个或那个,下一个正则表达式的东西.
我正在编写一个文本规范化器,用于将文本分成单词,小写,删除标点符号等,而strtr是我的瑞士军刀,它可以通过正则表达式甚至str_replace()击败裤子.
strtr()不仅仅是单字符替换.它可以用任意长度的子串替换任意长度的子串,但它看起来仍然很快.
14> Armin Ronach..: PHP的一个不太知名的特性是extract()
,一个将关联数组解包到本地命名空间的函数.这可能存在于自动全球污染中,但对模板非常有用:
function render_template($template_name, $context, $as_string=false)
{
extract($context);
if ($as_string)
ob_start();
include TEMPLATE_DIR . '/' . $template_name;
if ($as_string)
return ob_get_clean();
}
现在您可以使用render_template('index.html', array('foo' => 'bar'))
且仅$foo
与"bar"
模板中显示的值一起使用.
我会因为建议使用extract()以任何方式都是一个很好的功能而对你生气.但我想使用它非常方便.我想这是有一次我看到它用在一个好主意的地方!
它的逆,紧凑()也很好:$ a = 1; $ b = 2; 紧凑的('a','b'); // ==数组('a'=> $ a,'b'=> $ b)
extract()使你自己的极轻量级模板系统变得简单易行.+1
在这种情况下,我建议不要使用常用词作为函数参数名,因为extract()的$ context可以包含'as_string'或'template_name'索引的值.使用EXTR_SKIP是可以接受的,但只是将问题移到别处(例如,如果模板期望$ as_string,它将获得不正确的值.)
是的,这可能是extract()唯一真正好用的.
15> Darren Newto..: Range() 本身并不隐藏,但我仍然看到很多人在迭代:
for ($i=0; $i < $x; $i++) {
// code...
}
当他们可以使用时:
foreach (range(0, 12) as $number) {
// ...
}
你可以做一些简单的事情
foreach (range(date("Y"), date("Y")+20) as $i)
{
print "\t{$i} \n";
}
它可能是一个微优化,但值得注意的是,for和while比foreach更快,内存更少.
你可以做foreach($ array as $ key => $ value){}这甚至更简单.
你应该试试Python.它就像"for i in range(12)"一样简单,或者你可以使用更高效的xrange.
@Newbie,怎么样?
@SilentGhost:你仍然需要一个数组来开始,但情况并非总是如此.@Newbie:请详细说明?
16> VolkerK..: 启用PHP的webspace 通常比使用(asp).net的东西便宜.你可以 称之为一个功能;-)
称之为一个功能;-)
只有我知道Windows具有成本效益的地方才能获得STEEEEP在服务器软件上的折扣,因为我的部门购买100个窗口的价格比在Linux上培训我们的管理员要便宜得多(部分让我伤心,但他们的窗户设置干净,设置良好).
就目前而言,你必须只进行一次切换,而你迟早要购买新的许可证......
如果您不必为每台服务器付费,那么设置多台服务器的成本也会低得多.
17> 小智..: CLI的 一个很好的功能是CLI .它在文档中并没有那么"提升",但是如果你需要常规脚本/控制台应用程序,那么使用cron + php cli的开发速度非常快!
18> dcousineau..: 该static
关键字在OOP立场之外是有用的.您可以使用以下简单的方法快速轻松地实现"memoization"或函数缓存:
该static
关键字创建的变量仅在该函数的执行范围内持久存在.这种技术非常适合在数据库中使用get_all_books_by_id(...)
或者get_all_categories(...)
在页面加载期间多次调用的函数.
警告: 确保找到为哈希创建密钥的最佳方法,几乎在任何情况下md5(...)
上述都不是一个好的决定(速度和输出长度问题),我将其用于说明目的.sprintf('%u', crc32(...))
或spl_object_hash(...)
根据具体情况可能会好得多.
只是来自C/C++的复制功能
@GetFree我认为没有人会否认几乎所有的PHP都是从C,C++,Perl等复制的.
19> e-satis..: 然后"打印"技巧
如果$ flag为真,将回显Blah.不与ECHO合作.
这在模板中非常方便并取代了?:这不是很容易阅读.
实际上,与<?php if($ flag)打印"Blah"的字符数相同
我自己发现三元运算符比利用逻辑和算法的评估短期更为明显.
@all评论 - 这不是关于你能得到多短!这是关于模板人的可读性和易用性,模板人有时甚至不是程序员.
我会评论if()语句更容易,更易读.对我来说当然比在PHP中利用"和"运算符的副作用更容易,因为它很容易出错(或者在你稍后阅读代码时看起来像是一个错误).例如,如上所述,这将不会以"echo"的方式工作.if()没有像这样的陷阱.
括号不像"和"那样容易打字,特别是在我的血腥法语键盘上;-)
假设你启用了短标签,这就更短了:`<?= $ flag?'blah':''?>`.实际上没有短标签,它仍然更短.
20> 小智..: 你可以在变量名中 使用减号, 如下所示:
class style
{
....
function set_bg_colour($c)
{
$this->{'background-color'} = $c;
}
}
为什么要用它?不知道:也许是CSS模型?或者你需要输出一些奇怪的JSON.这是一个奇怪的功能:)
花括号允许您访问具有破折号,点和其他非字母数字实体的对象.使用它的一个原因是在处理xml时,实体名称可以像NITF/NewsML
一样点缀.如果你使用SimpleXML,你可以像`$ item-> DataContent-> body - > {'body.content'}`一样访问它. 这适用于方法名称吗?对于使用路由器的框架非常有用,我想要domain.com/something-with-minuses/view/ PHP变量在使用这种方式时可以使用任何字符,甚至是空格和换行符. 21> Jamol..: 可能没有多少人知道可以将常量"变量"指定为函数参数的默认值:
function myFunc($param1, $param2 = MY_CONST)
{
//code...
}
字符串 可以用来作为 如果他们数组 :
$str = 'hell o World';
echo $str; //outputs: "hell o World"
$str[0] = 'H';
echo $str; //outputs: "Hell o World"
$str[4] = null;
echo $str; //outputs: "Hello World"
如果您有多字节字符串(外语等),请小心将字符串视为数组 最后一个是漂亮的.虽然我不知道什么时候比其他一些移除角色的方法更好.尽管如此 它可能比调用函数更有效.字符串通常连续存储在内存中,因此获得$ str [4]是微不足道的.将字符串存储为字符数组对于从C派生的大多数语言来说都很常见. 22> 小智..: HEREDOC 语法是我最喜欢的隐藏功能.总是很难找到,因为你不能谷歌为<<<但它停止你必须逃避大块的HTML,仍然允许你将变量放入流.
echo <<
EOM;
注意:关闭EOM; 不能缩进.
亲爱的上帝,这是我见过的最丑陋的代码.如果你正在使用HEREDOC,那么你没有将表现与逻辑分开.
HEREDOC是我最喜欢的构建和使用SQL语句的方法.
23> artlung..: 关于PHP代码最有用的一点是,如果我不太了解一个函数,我看到我可以通过使用浏览器并输入以下内容来查找:
http://php.net/function
上个月我在一些代码中看到了"范围"功能.它是我设法永远不会使用的数百个功能之一,但结果非常有用:
http://php.net/range
该URL是http://us2.php.net/manual/en/function.range.php的别名.将函数和关键字映射到URL的 简单想法非常棒.
我希望其他语言,框架,数据库,操作系统具有查找文档的简单机制.
`range()`对于`foreach(范围(1,10)为$ i){};`非常有用
24> Sam152..: 快速阻止评论
/*
die('You shall not pass!');
//*/
//*
die('You shall not pass!');
//*/
这些注释允许您在代码块被注释为一个字符时切换.
这不是PHP特有的.这适用于支持`// ...`行注释和`/*...*/`块注释的任何语言.
我之前也使用了`/**/`和之后的`/**/`.您可以通过删除和添加第一个空格来切换块.这有一个额外的好处是使用CSS(以及其他不支持`// ...`注释的语言).
25> MSpreij..: 我的清单......其中大多数都比"最喜欢的功能"("我希望!")更多地属于"隐藏功能",而且并非所有功能都有用,但是......是的.
// swap values. any number of vars works, obviously
list($a, $b) = array($b, $a);
// nested list() calls "fill" variables from multidim arrays:
$arr = array(
array('aaaa', 'bbb'),
array('cc', 'd')
);
list(list($a, $b), list($c, $d)) = $arr;
echo "$a $b $c $d"; // -> aaaa bbb cc d
// list() values to arrays
while (list($arr1[], $arr2[], $arr3[]) = mysql_fetch_row($res)) { .. }
// or get columns from a matrix
foreach($data as $row) list($col_1[], $col_2[], $col_3[]) = $row;
// abusing the ternary operator to set other variables as a side effect:
$foo = $condition ? 'Yes' . (($bar = 'right') && false) : 'No' . (($bar = 'left') && false);
// boolean False cast to string for concatenation becomes an empty string ''.
// you can also use list() but that's so boring ;-)
list($foo, $bar) = $condition ? array('Yes', 'right') : array('No', 'left');
您也可以嵌套三元运算符,有时会派上用场.
// the strings' "Complex syntax" allows for *weird* stuff.
// given $i = 3, if $custom is true, set $foo to $P['size3'], else to $C['size3']:
$foo = ${$custom?'P':'C'}['size'.$i];
$foo = $custom?$P['size'.$i]:$C['size'.$i]; // does the same, but it's too long ;-)
// similarly, splitting an array $all_rows into two arrays $data0 and $data1 based
// on some field 'active' in the sub-arrays:
foreach ($all_rows as $row) ${'data'.($row['active']?1:0)}[] = $row;
// slight adaption from another answer here, I had to try out what else you could
// abuse as variable names.. turns out, way too much...
$string = 'f.> 'asdfasf'
echo $GLOBALS['f.> 'asdfasf'
// (don't do this. srsly.)
${''} = 456;
echo ${''}; // -> 456
echo $GLOBALS['']; // -> 456
// I have no idea.
对,我现在停下来:-)
嗯,已经有一段时间..
// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;
因此,刚发现您可以将任何字符串作为方法名称传递,如果用大括号括起来的话.您不能将任何字符串定义为方法唉,但您可以使用__call()捕获它们,并根据需要进一步处理它们.嗯....
class foo {
function __call($func, $args) {
eval ($func);
}
}
$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."\n";}'}();
在Reddit发现这个小宝石评论:
$foo = 'abcde';
$strlen = 'strlen';
echo "$foo is {$strlen($foo)} characters long."; // "abcde is 5 characters long."
你不能像这样直接调用{}内的函数,但你可以 使用variables-holding-the-function-name并调用它们!(*和*你也可以使用变量变量)
请不要过度使用三元比较运算符; 这会导致代码混淆.
26> MattBelanger..: 数组操作.
大量用于处理和操作数组的工具.它可能不是PHP独有的,但我从来没有使用过这么简单的语言.
好吧,PHP数组是一个数据结构,可以很容易地用作堆栈,队列,双端队列,列表,哈希表等.它确实非常灵活,适用于大多数常见需求,而不需要使用除array_*函数之外的任何其他功能.
Python做数组(作为列表和元组)比PHP做得好得多.
27> Andrew Taylo..: 我有点像你,我已经编写了超过8年的PHP编码.大约一年前我不得不参加.NET/C#课程,我非常喜欢C#语言(讨厌ASP.NET),但它让我成为了一个更好的PHP开发人员.
PHP作为一种语言非常差,但是,我非常快,LAMP堆栈非常棒.最终产品远远超过了各部分的总和.
那说,回答你的问题:
http://uk.php.net/SPL
我喜欢SPL ,C#中的集合类是我一开始就喜欢它的东西.现在我可以吃蛋糕了.
安德鲁
28> staticsan..: 我有点惊讶没有人提到它,但我最喜欢的数组之一就是使用plus运算符.这有点像array_merge()
但有点简单.我发现它通常是我想要的.实际上,它接收RHS中的所有条目并使它们出现在LHS的副本中,根据需要进行覆盖(即它是非交换的).对于以"默认"数组开始并在一次点击中添加一些实际值非常有用,同时为未提供的值保留默认值.
请求的代码示例:
// Set the normal defaults.
$control_defaults = array( 'type' => 'text', 'size' => 30 );
// ... many lines later ...
$control_5 = $control_defaults + array( 'name' => 'surname', 'size' => 40 );
// This is the same as:
// $control_5 = array( 'type' => 'text', 'name' => 'surname', 'size' => 40 );
我认为当你需要维护很多代码时,它不像array_merge那么清晰.至少,当你使用array_merge函数时,很明显你正在处理数组.
29> George Mauer..: 这是一个,我喜欢如何设置 未提供的函数参数的默认值 更容易:
function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
比C#更容易(我认为C++和Java)
比什么更容易?大多数语言都有此功能.
C++支持默认参数值.
有趣的是,我上周在谷歌阅读器中看到了这个"隐藏的功能".我没有得到它隐藏的内容 - 它是基本语法.例如,尝试if($ var = true).
c#根本不支持默认值.你必须编写一个重载函数,并始终声明一个简单繁琐的值
30> Bob Fanger..: 快速和脏 是默认值.
该语言充满了有用的快捷方式,这使得PHP成为缩短产品上市时间的(小)项目的理想选择.不是那么干净的PHP代码是不可能的,只需要一些额外的努力和经验.
但是我喜欢PHP,因为它可以让我在没有输入文章的情况下表达我想要的东西.
PHP:
if (preg_match("/cat/","one cat")) {
// do something
}
JAVA:
import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
// do something
}
是的,这包括不输入Int .
Java:if(Pattern.matches("cat","one cat")){//做某事}如果你不知道就停止抱怨java.
@OIS他的例子的目的是说明和比较快速正则表达式匹配的运行,而不是如何在"一只猫"中找到字符串"cat".
你应该使用strpos:if(false!== strpos("one cat","cat")){
+1 Willi你怎么做preg_replace('/([<\ []! - \s*)(\ S*?)(\ s* - [> \]]?)/ se',"\ $ this->选择('\\ 1','\\ 2','\\ 3',\ $ data)",$ text); 在Java?这会在输入文本中找到注释,然后使用匹配的元素调用函数,在这种情况下,$ this-> choose(...)决定用什么来替换匹配并返回结果.
31> Shane H..: 通过ob_start()输出缓冲 比大多数人意识到的要有用得多.这里的第一个隐藏功能是ob_start接受回调:
function twiterize($text) {
// Replace @somename with the full twitter handle
return preg_replace("(\s+)@(\w)+(\s+)", "http://www.twitter.com/${2}", $text);
}
ob_start(twiterize);
其次,您可以嵌套输出缓冲区...使用前面的示例:
ob_start(parseTemplate);
// ...
ob_start(twiterize);
// ...
ob_end_flush();
// ...
ob_end_flush();
帮助内容,文本广告,字典/索引功能,链接,链接重定向以进行跟踪,模板引擎,通过使用这两件事的不同组合,所有这些都非常容易.
我知道它很懒,但我在我的代码中使用输出缓冲,我可以添加标题,完全避免已经发送的标题错误.这在模板中最为明显,如果在嵌套模板的某个深处发生错误,则添加标头以将用户重定向到错误页面很简单.
32> manixrock..: 您可以使用break N ;
退出嵌套循环(以弥补缺乏goto
).例如
for (int i=0; i<100; i++) {
foreach ($myarr as $item) {
if ($item['name'] == 'abort')
break 2;
}
}
更多信息,请访问http://php.net/manual/en/control-structures.break.php
goto实际上并不缺乏......
33> Jan Gorman..: 实际上,你不是很正确,你不能指定方法所期望的类型,它可以按照你的期望工作.
function foo ( array $param0, stdClass $param1 );
注意: 这仅适用于"数组"和对象名称.
依此类推,您甚至可以将自己的类传递给预期的参数.使用其他方法调用方法/函数将导致致命错误.
关于PHP中良好智能感知的另一个暗示.我们使用ZendStudio,如果你为你的方法编写好的PHPDocs,它实际上会工作得更好,它会在暗示时查看它们.
我和你在一起,直到你建议ZendStudio是一个可以远程通过的IDE.
根据http://ch2.php.net/language.oop5.typehinting,类型提示不支持"string".从PHP 5.1开始支持"array",从5.0开始支持特定的对象类型.
34> 小智..: a)手册 - 非常全面,最新,只是一个巨大的灵感来源,同时解决问题 - 被困?浏览/搜索手册,它会来找你
b)数组 - 它们是塑料的,它们是关联索引的,它们可以很容易地嵌套(!)以组成一些野生数据结构,并且有许多函数仅用于数组操作.哦,我是否提到将单独的变量视为值数组?
c)eval() 和类似的结构(如动态变量和函数名称)允许更大的灵活性(如果你知道你正在做什么,仍然相对安全) - 没有什么比基本定义自己的流程的程序更好(在飞行中甚至是特定的执行
d)最容易被忽视的东西:因为ZEND引擎中的几乎所有内容都是zVal (本质上是指针引用的集合),能够以函数返回值返回任何内容
另外,我想指出一个很棒的功能,但其中一个与PHP源相关的功能比语言更多(因此 - 单独列出):
e)编写C扩展 的难易程度(主要是OpenAL或SDL等其他对象的接口) - 优秀的源代码结构和"内部"上与"外部"一样多的强大工具 - 如果您需要扩展功能稍微进一步.
我一直在写PHP全职工作已经5年了,并且没有遇到我合法需要使用eval()或变量变量的单一情况.
35> Christian St..: 日期功能 .我必须整天处理大量的时间信息和日期字符串,所以像strftime()和strtotime()这样的函数真是太棒了.
请务必查看DateTime.http://php.net/datetime
我完全不同意.在DateTime出现之前,在PHP中做日期是可怕的.
实际上strtotime很糟糕,因为魔法现在已经记录在案,你不能使用自定义格式进行解析.-1
36> Eric Muyser..: 除了即时访问开始编码你需要的任何网站?
除了魔术方法和反射,一些有趣的功能是:
serialize
/ unserialize
- 通过sql,cookies,进程,flatfile保存状态良好.好东西.
json_encode
/ json_decode
- 即时AJAX乐趣
get_class
- 对那些疲惫松散的时刻有帮助
call_user_func_array
- 当您可以将代码作为字符串使用时(功能强大)
method_exists
- 反思
func_num_arg
s/func_get_arg
- 未知参数ftw
set_error_handler
/ set_exception_handler
- 脚本语言的非常好的调试功能
37> Alex L..: 对于基本字符验证,Ctype函数比preg_match()更快.
ctype_alnum() - 检查字母数字字符
ctype_alpha() - 检查字母字符
ctype_cntrl() - 检查控制字符
ctype_digit() - 检查数字字符
......等等. .
38> Justin Johns..: 通过错误控制操作符@的错误抑制几乎不应该被使用.它通过简单地忽略错误来促进懒惰和非防御性编码实践,创建调试噩梦,因为所有类型的错误 - 甚至是致命错误 - 都将被抑制,并且在某些情况下,可能会导致性能下降(特别是在抑制大的时候)大量的错误).
我很高兴你说"几乎从不".函数fopen()因无法打开文件而抛出警告*和*返回可测试的失败值而臭名昭着.不幸的是,唯一的解决方案是使用@fopen().
良好的防御性编程不仅仅是忽视这个问题.此外,使用`isset`或`empty`时不应该收到任何通知
影子:如果你收到很多很多通知,那就表明编码做法很差.抑制错误是沙子态度的头脑.它可以回来咬你.如果一个值意味着存在,那么它就不是一个错误.如果值可以未定义,那么你应该测试它.否则会导致安全漏洞.
39> Elzo Valugi..: filter_var 函数.不是隐藏的珍珠,而是新的.
40> djn..: 好吧,我最近向付费客户发送了我的第一个GUI应用程序 - 用PHP编写!它从条形码阅读器或GUI按钮,复选框,单选按钮或文本字段,商店到SQLite或远程MySQL收集数据,启动其他Windows应用程序,将压缩的XML报告作为电子邮件附件发送,加密和解密存储的数据,甚至播放声音完成后.
是用miniPHP和Winbinder做的.这够隐藏吗?我想没有多少PHP开发人员真的试过这个.
-1,有理由不尝试它
41> Luc M..: 您可以轻松地将元素添加到数组中.
$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';
元素可以是任何东西:对象,数组,标量......
恰恰相反; 没有那条线是许多问题和错误的根源.
"不必要的第一行"< - 完全错误!如果你没有初始化阵列,你可以在不同的服务器上遇到很多问题.您应该在使用前始终初始化所有内容.
42> Frank Koehl..: 正如其他人所提到的,在命令行级别运行PHP 的能力非常棒.我将PHP脚本设置为cron作业,以便始终进行数据清理和备份.只需使用以下行启动文件:
#!/usr/bin/php5
请注意,第一行可能会有所不同,具体取决于系统上安装PHP的位置.
从这里开始,很容易为更复杂的系统级进程(如守护进程)实现PHP .
protip:使用#!/ usr/bin/env php,它将更少依赖于php二进制文件驻留在磁盘上的位置. 或者你可以指向#!/ usr/bin/env并让系统为你找到它. 43> Xeoncross..: 速记布尔链
如果您在Web可访问区域中拥有PHP文件,那么这非常有用.通过在每个文件的顶部插入这个小花絮,您可以确保没有人可以访问任何文件,但index.php
这将打印"HelloWorld"而不是"Hello World". 44> Ian..: 内置过滤器,用于根据特定的预定义类型解析变量 - 以及覆盖基础知识(int/float等),扩展到覆盖电子邮件,URL,甚至变量是有效的正则表达式.
http://ch2.php.net/manual/en/book.filter.php
45> Annika Backs..: 类型转换 和 ctype_*函数对于确保数据清晰非常重要.我最近广泛使用了异常,这大大简化了我的错误处理代码.
我不会说这种语言有很多杀手锏.(至少,我找不到很多机会去找他们.)我喜欢这种语言不引人注目.
46> RaYell..: 在字符串中使用数组元素或对象属性.
而不是写作
$newVar = $ar['foo']['bar'];
echo "Array value is $newVar";
$newVar = $obj->foo->bar;
echo "Object value is $newVar";
你可以写:
echo "Array value is {$ar['foo']['bar']}";
echo "Object value is {$obj->foo->bar}";
47> Alex L..: 该ReflectionClass类提供有关给定类的信息.
$classInfo = new ReflectionClass ('MyClass');
if ($classInfo->hasMethod($methodName))
{
$cm = $classInfo->getMethod($name);
$methodResult = $cm->invoke(null);
}
除其他外,检查方法是否存在并调用它是有用的.
48> 小智..: preg_split(),array_intersect()和array_intersect_key().
49> bob-the-dest..: 几乎任何文件类型都可以included
从.html到.jpeg.将执行在PHP开放标记内绑定的任何字节字符串.是的,goat.se的图像可以包含您所有常用的实用功能.我猜测的内部行为include
是将输入文件转换为字符串,并解析任何PHP代码.