PHP的隐藏功能?
我知道这听起来像是一个尖锐的问题,但让我解释一下我的来历。
大学毕业后,我在一家PHP商店找到了一份工作。我在那里工作了一年半,以为我已经学到了学习编程的全部知识。
然后,我在一家规模相当大的公司担任单人内部开发商店的工作,所有工作都在C#中进行。为了履行这一职责,我开始阅读大量的博客和书籍,并很快意识到我以为自己了解所有知识是多么错误。我了解了单元测试,依赖项注入和装饰器模式,松耦合的设计原理,关于继承的讨论等等,我仍然非常着迷于此。不用说,我的编程风格在去年完全改变了。
现在,我发现自己接一个php项目,为一个朋友的创业做一些编码,与C#编程相反,我感到完全被束缚了。确实让我感到困扰的是,必须通过添加'$ this->'来引用类作用域中的所有变量。令我烦恼的是,我尝试过的所有IDE都没有很好的智能感知能力,而我的SimpleTest单元测试方法必须以单词" test"开头。动态类型使我无法隐式指定方法需要哪种参数类型,而必须编写switch语句来执行方法重载,这使我感到疯狂。我不能忍受不能有嵌套的名称空间,而必须使用::运算符来调用基类的构造函数。
现在,我无意启动PHP vs Cdebate,我的意思是说我确定有些PHP功能我不了解或者无法正常使用。我被安置在Cuniverse中,无法在玻璃碗外面看。
所以我问,我们最喜欢PHP的哪些功能?在.Net语言中,我们可以做哪些事情,这些事情我们做不到或者很难做?
解决方案
回答
这是一个,我喜欢如何在未提供的函数参数上设置默认值更容易:
function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
回答
魔术方法是彻头彻尾的方法,只要我们调用不存在的方法,或者分配或者读取不存在的属性等即可调用。
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)。
回答
据我所知,流处理程序使我们可以使用大多数其他语言很难做到的逻辑来扩展"文件系统"。
例如,使用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);
回答
文档。该文档获得我的投票。我还没有遇到有关编程语言的更详尽的在线文档,我需要从各种网站和手册页中整理所有其他内容。
回答
数组操作。
大量用于处理和操作数组的工具。它可能不是PHP所独有的,但我从未使用过使它如此简单的语言。
回答
实际上,我们不能完全指定不能指定方法期望的类型,它确实可以按我们期望的那样工作。
function foo ( array $param0, stdClass $param1 );
注意:这仅适用于"数组"和对象名称。
依此类推,甚至可以传入自己的类作为预期参数。用其他方法调用方法/函数将导致致命错误。
有关PHP良好的智能感知的另一个提示。我们使用ZendStudio,如果为方法编写好的PHPDocs,它实际上会更好地工作,它会在提示时进行查找。
回答
启用PHP的网站空间通常比使用(asp).net的网站便宜。
我们可以将其称为功能;-)
回答
毫无疑问,可变变量和函数!
$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);
非常非常棒。 Make的使用循环和模式进行编码非常容易,并且比eval更快,更受控制(感谢@Ross和@Joshi Spawnbrood!.t)
回答
好的:
- PHP在WebHosting中的广泛接受。几乎每个网络托管服务都具有PHP支持。
- 简单的事情可以用简单的代码解决。无需严格要求任何类或者名称空间。
坏的:
- 有很多功能,没有任何命名约定。很难记住所有这些功能才能有效地使用它。
- 不良的编码习惯,遍布网络:(
回答
specifying implicitly which parameter type a method expects
实际上,这是部分可行的(至少在PHP5中),我们可以为函数和方法指定数组和对象参数的类型,尽管在标量类型的情况下运气不好。
class Bar { public function __construct(array $Parameters, Bar $AnotherBar){} }
除了这一点和Allain提到的神奇方法外,我还发现SPL(标准PHP库)提供的接口是必不可少的,我们可以在类中实现必要的方法,例如,我特别喜欢ArrayAccess和Iterator接口,它允许像关联数组一样的对象,或者像任何简单数组一样对其进行迭代。
回答
类型转换和ctype_ *函数对于确保数据干净非常重要。最近,我广泛使用了异常,这大大简化了我的错误处理代码。
我不会说该语言具有许多杀手级功能。 (至少,我找不到很多机会找到它们。)我喜欢这种语言并不引人注目。
回答
数组。从这个问题的答案来看,我认为人们不会完全理解PHP中数组的简单性和实用性。 PHP数组同时充当列表,映射,堆栈和通用数据结构。数组是在语言核心中实现的,并在各地使用,这会导致良好的CPU缓存局部性。 Perl和Python都为列表和地图使用了单独的语言构造,从而导致更多的复制和可能引起混乱的转换。
回答
查找与PHP相关的事物(例如示例,应用程序,类,文档,框架等)非常容易。
在整个网络上,这是一种(自己动手)突击队时最容易学习的语言,也是一种让时间更有价值的语言。
学习PHP之后,可以将CMS与joomla结合在一起,将博客与wordpress等结合起来。
回答
a)手册-极其全面,最新,只是解决问题的巨大灵感来源?浏览/搜索手册,它将交给我们
b)数组是可塑性的,它们被关联索引,可以很容易地嵌套(!)来构成一些野生数据结构,并且仅针对数组操作就有许多功能。哦,我是否提到将单独的变量视为值数组?
c)eval()和类似的构造(例如动态变量和函数名称)可提供更大的灵活性(并且只要我们知道自己在做什么,就仍然是相对安全的),没有什么能比基本上定义其自己的流程(或者甚至是特定的执行)
d)最有可能最容易忽略的事情:由于ZEND引擎中的几乎所有内容都是zVal(本质上是指针引用的集合),因此能够将任何内容作为函数返回值返回
另外,我想指出一个很棒的功能,但是与语言相比,它与PHP源代码的关系更大(因此单独列出):
e)易于编写C扩展(主要是OpenAL或者SDL之类的其他对象的接口)出色的源代码结构,并且如果需要扩展功能,则"内部"上与"外部"上一样多的强大工具只是一点点。
回答
易用性。最大的功能是让新开发人员坐下来编写"工作"脚本并理解代码是多么容易。
最糟糕的功能是让新开发人员坐下来编写"工作"脚本并认为他们理解代码是多么容易。
围绕PHP的社区的开放性以及作为开放源代码可用的大量PHP项目对进入开发世界的人并没有像对我们这样的人来说可能会令人生畏,这可以成为进入更成熟语言的垫脚石。
我不会像以前讨论过很多技术性问题,但是如果我们将PHP视为社区而不是Web语言,那是一个在我们开始开发时就明确地拥抱了社区,那么好处是不言而喻的。
回答
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')))
,并且模板中仅显示带有$ bar值的$ foo。
回答
我有点像我们,我已经为PHP编码了8年以上。大约一年前,我不得不参加.NET / Ccourse,我真的很喜欢Clanguage(讨厌ASP.NET),但是它使我成为了一个更好的PHP开发人员。
PHP作为一种语言是相当差的,但是,我使用它非常快,并且LAMP堆栈很棒。最终产品远远超过零件的总和。
也就是说,在回答问题时:
http://uk.php.net/SPL
我喜欢SPL,我一开始就喜欢Cwa中的collection类。现在我可以吃蛋糕了。
安德鲁
回答
内置的过滤器可针对特定的预定义类型解析变量,并涵盖基础知识(int / float等),甚至可以扩展到涵盖电子邮件,URL,即使变量是有效的正则表达式也是如此。
http://ch2.php.net/manual/zh/book.filter.php
回答
set_include_path()辅助的__autoload()
(类)文件。
在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将自动按需包含所需的文件,从而节省了解析时间和内存。
回答
然后是"和打印"技巧
<?php $flag and print "Blah" ?>
如果$ flag为true,将回显Blah。不适用于ECHO。
这在模板和替换中非常方便。 :那不是很容易阅读。
回答
标准类是一个干净的容器。我是最近才知道的。
而不是使用数组来保存服务器属性
$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.";
回答
PHP的一个不错的功能是CLI。在文档中并不是那么"高级",但是如果我们需要例行脚本/控制台应用程序,那么使用cron + php cli的开发确实非常快!
回答
我们可以利用or
运算符的优先级比=
低的优势来做到这一点:
$page = (int) @$_GET['page'] or $page = 1;
如果第一个赋值的值为true,则忽略第二个赋值。另一个例子:
$record = get_record($id) or throw new Exception("...");
回答
快速和肮脏是默认设置。
该语言充满了有用的快捷方式,这使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。
回答
strtr()
它的速度非常快,以至我们会惊讶不已。在内部,它可能使用一些疯狂的b树类型结构来按其公共前缀来排列匹配项。我将它与200多个查找和替换字符串一起使用,并且它在不到100ms的时间内仍通过了1MB。对于所有很小的字符串,即使考虑到字符集,strtr()在执行完全相同的操作时也比strtolower()显着更快。我们可能使用连续的strtr调用编写了一个完整的解析器,它比通常的正则表达式匹配要快,找出了令牌类型,输出了这个或者那个,接下来的正则表达式之类的东西。
我正在编写一个文本归一化器,用于将文本拆分为单词,使用小写字母,删除标点符号等,而strtr是我的瑞士军刀,它击败了常规表达式甚至str_replace()的裤子。
回答
日期功能。我必须整天处理很多时间信息和日期字符串,因此strftime()和strtotime()之类的功能真棒。
回答
可能没有多少人知道可以将常量"变量"指定为函数参数的默认值:
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"
回答
好吧,社区对我来说是第一位的。
无论问题是什么,我们总是会找到一个曾经有过解决方案的人,几乎每次都找到解决方案……有时我看到了完全免费的想法,解决单个问题的方法。
我现在正在尝试学习Python(成长为……好吧……程序员,可以吗?),Python最有用的是缩进。
我喜欢PHP的缩进,用于变量的$标记,用于循环和循环的花括号,好吧,那些聪明的事情使我的代码非常易于理解(即使写代码的人很少。 "意大利面条代码",是吗?)
PHP中的数组非常简单而且功能强大。
数据库:MySQL,Postrgee,sql;我们可以轻松使用几乎所有类型的数据库。
快速:在逻辑上取决于代码的编写方式,但是对于中小型应用程序,PHP通常相当快(因为它在大型应用程序中会失去作用)。
回答
我们可以轻松地将元素添加到数组。
$my_array = array(); $my_array[] = 'first element'; $my_array[] = 'second element';
元素可以是任何东西:对象,数组,标量...
回答
我们可以在变量名称中使用减号,如下所示:
class style { .... function set_bg_colour($c) { $this->{'background-color'} = $c; } }
为什么要使用它?不知道:也许是CSS模型?或者我们需要输出的一些奇怪的JSON。这是一个奇怪的功能:)
回答
我偏爱其他PHP用户。必要时很容易获得答案和指导。
回答
我喜欢远程文件。对于Web开发,这种功能非常有用。
需要使用网页的内容吗?一个简单的
$fp = fopen('http://example.com');
就像其他普通文件一样,我们已经准备好使用文件句柄。
还是直接将远程文件或者网页读入字符串中呢?
$str = file_get_contents('http://example.com/file');
这种特定方法的有用性很难高估。
是否要分析远程图像?如何通过FTP进行操作?
$imageInfo = getimagesize('ftp://user:[email protected]/image/name.jpg');
几乎所有与文件一起使用的PHP函数都可以与远程文件一起使用。我们甚至可以通过这种方式远程地包含" include()"或者" require()"代码文件。
回答
快速块评论
/* die('You shall not pass!'); //*/ //* die('You shall not pass!'); //*/
这些注释使我们可以切换是否用一个字符注释一个代码块。
回答
让我们来看看...
- 三元运算符。他们为处理表单结果中的复选框而创造了奇迹。 $ var =($ _POST ['my_checkbox'] =='checked')吗?真假;
- 所有精彩的字符串和数组处理功能都值得一遍。我最喜欢的是strtotime(),strlen()和strpos()。
- SimpleXML类和json_decode()函数。使用file_get_contents()调用REST API或者RSS feed,使用其中一种工具轻松解析它,即可完成。
回答
几乎永远不要使用通过错误控制运算符@进行的错误抑制。它通过简单地忽略错误来促进懒惰的和非防御性的编码实践,创建调试噩梦,因为所有类型的错误(甚至是致命错误)都将被抑制,并且在某些情况下会导致性能下降(尤其是在抑制较大错误时)错误数量)。
回答
preg_split(),array_intersect()和array_intersect_key()。
回答
在OOP立场之外,static
关键字很有用。我们可以使用以下简单的方法快速轻松地实现"内存化"或者函数缓存:
<?php function foo($arg1) { static $cache; if( !isset($cache[md5($arg1)]) ) { // Do the work here $cache[md5($arg1)] = $results; } return $cache[md5($arg1)]; } ?>
" static"关键字创建一个变量,该变量仅在执行后一直存在于该函数的范围内。这项技术非常适合击中数据库的函数,例如" get_all_books_by_id(...)"或者" get_all_categories(...)",在页面加载期间我们会多次调用这些函数。
警告:请确保我们找到为哈希创建密钥的最佳方法,在几乎每种情况下,上述md5(...)
都不是一个好的决定(速度和输出长度问题),我将其用于说明性目的。取决于上下文,sprintf('%u',crc32(...))
或者spl_object_hash(...)
可能要好得多。
回答
我的清单..他们中的大多数都比"最喜欢的功能"更受"隐藏功能"的影响(我希望!),而且并非所有功能都有用,但是..是的。
// 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.> <!-? o+'; ${$string} = 'asdfasf'; echo ${$string}; // -> 'asdfasf' echo $GLOBALS['f.> <!-? o+']; // -> '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."
我们不能像这样直接在{}内部调用函数,但是可以使用variable-holding-the-function-name并调用它们! (和我们也可以在其上使用变量变量)
回答
关于PHP代码,最有用的一点是,如果我不太了解某个函数,则可以使用浏览器并键入以下命令来查找它:
http://php.net/function
上个月,我在一些代码中看到了"范围"功能。这是我从未使用过但真正有用的数百个功能之一:
http://php.net/range
该网址是http://us2.php.net/manual/en/function.range.php的别名。将函数和关键字映射到url的简单想法很棒。
我希望其他语言,框架,数据库,操作系统具有查找文档的简单机制。
回答
令我惊讶的是,还没有人提到它,但是我最喜欢的数组技巧之一是使用加号运算符。它有点像" 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 );
回答
这很棒:
//file page_specific_funcs.inc function doOtherThing(){ } class MyClass{ } //end file //file.php function doSomething(){ include("page_specific_funcs.inc"); $var = new MyClass(); } //end of file.php
"page_specific_funcs.inc" file is only included if doSomething gets called. The declaration of classes, funcs, etc., inside methods works perfectly.
回答
布尔值转换,对于上面的redwall_hp的第一个示例特别有用。
代替:
$var = ($_POST['my_checkbox']=='checked') ? TRUE : FALSE;
我们可以输入:
$var = !!($_POST['my_checkbox']=='checked');
回答
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<option value=\"{$i}\">{$i}</option>\n"; }
回答
据我所知,我们可以在函数调用中隐式参数类型:
function getInt(int $v) { echo $v; } getInt(5); // will work getInt('hello'); // will fail
回答
绝对是魔术和重载方法。 Allain引用了__get(),__set(),__call()和__toString(),但我也喜欢__wakeup()和__sleep()。
当对象被序列化(睡眠)和反序列化(唤醒)时,将调用此魔术方法。此功能使我可以在应用程序中使用类似可序列化的数据库包装程序这样的功能:
Class Connection { private $dsn; private $connection; ... public __wakeup() { $this->connection = ADONewConnection(); } }
这样我可以在$ _SESSION等中"保存"连接。
回答
php中的json_encode / decode函数非常有用,尽管不是很隐藏。
回答
除了即时访问之外,我们还可以开始编写网站所需的任何代码?
除了魔术方法和反射之外,还有一些有趣的功能:
serialize
/unserialize
-通过sql,cookie,进程,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-脚本语言的非常好的调试功能
回答
HEREDOC语法是我最喜欢的隐藏功能。总是很难找到,因为我们无法使用Google << <<,但是它使我们不必转义大块HTML,仍然允许我们将变量放入流中。
echo <<<EOM <div id="someblock"> <img src="{$file}" /> </div> EOM;
回答
我也喜欢'和'之间的区别。
$foo = 'Bob'; echo 'My name is {$foo}'; // Doesn't swap the variable echo "My name is {$foo}"; // Swaps the variable
因此,如果字符串不需要变量交换,请不要使用",这是浪费时间。我看到很多人一直在用"声明字符串。
注意:我使用{},因为它使我的变量更加突出。
回答
标准PHP库中隐藏了许多宝石。数组访问使我们可以构建可用于数组接口的对象,但可以在顶部添加自己的功能。
同样,通过在构造函数中设置标志来创建ArrayAccess对象时,我们可以将对象读取和写入为数组或者对象。这是一个例子:
$obj = new ArrayObject(array("name"=>"bob", "email"=>"[email protected]"),2); $obj->fullname = "Bob Example"; echo $obj["fullname"]; $obj["fullname"]="Bobby Example"; echo $obj->fullname;
回答
我喜欢从php隐藏的功能:
1.易于学习(也容易被误用..即:不良的编程习惯。例如,我们可以输入$ something =" 1";然后我们执行$ something + = 3;然后突然$ something变成了整数..没有错误消息/异常异常,例如Java中的异常)
- 很多图书馆。转到phpclasses.org,我几乎从那里得到了所有东西。
- 很多网站都在使用它。爱它或者恨它..事实就是如此! :)
- 简单,小巧,易于维护。我们只需在便携式设备上安装xampplite + vim(我的最爱)即可。
- 廉价 !!!像啤酒一样便宜...例如:托管。与java或者.net主机相比,php主机确实很便宜,并且我们可以从某些网站获得免费(尽管它们会在网站内放置一些横幅/隐藏的东西)
- PHP的文档非常好!这是我坚持使用PHP大约6年的主要原因(尽管我使用Groovy / Grails进行了一些项目)
回答
通过ob_start()进行输出缓冲比大多数实现的有用得多。这里的第一个隐藏功能是ob_start接受回调:
function twiterize($text) { // Replace @somename with the full twitter handle return preg_replace("(\s+)@(\w)+(\s+)", "http://www.twitter.com/", $text); } ob_start(twiterize);
其次,我们可以嵌套输出缓冲区...使用前面的示例:
ob_start(parseTemplate); // ... ob_start(twiterize); // ... ob_end_flush(); // ... ob_end_flush();
帮助内容,文本广告,字典/索引功能,链接跟踪,用于跟踪目的的链接重定向,模板引擎,通过使用这两种方法的不同组合,所有这些操作都非常容易。
回答
好吧,我最近将我的第一个GUI应用程序交付给了用PHP编写的付费客户!它从条形码读取器或者GUI按钮,复选框,单选按钮或者文本字段中收集数据,存储到SQLite或者远程MySQL,启动其他Windows应用程序,将压缩的XML报告作为电子邮件附件发送,加密和解密存储的数据,甚至播放声音完成时。
用miniPHP和Winbinder做到了。足够隐藏了吗?我想没有多少PHP开发人员真正尝试过此方法。
回答
控制结构的替代语法
很多人不知道这种语法。当我使用纯PHP作模板时,此语法提供了一种很好的方法,可以将诸如if或者foreach之类的简单控制结构与HTML模板代码混合使用,通常结合使用short打印变量的样式。
回答
我们可以通过func_get_args()
使用带有不确定数量的参数的函数。
<?php function test() { $args = func_get_args(); echo $args[2]; // will print 'd' echo $args[1]; // will print 3 } test(1,3,'d',4); ?>
回答
在字符串中使用数组元素或者对象属性。
而不是写
$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}";
回答
对于基本字符验证,Ctype函数比preg_match()更快。
ctype_alnum() — Check for alphanumeric character(s) ctype_alpha() — Check for alphabetic character(s) ctype_cntrl() — Check for control character(s) ctype_digit() — Check for numeric character(s) ...etc...
回答
我已经开始切换到python,而我在python中喜欢的一件事是实时解释器。直到后来从事php项目时,我才意识到php确实具有此选项,但它鲜为人知。在命令提示符下,键入php -a
并粘贴要测试的任何php代码,但请记住要以<?php
开头
回答
filter_var函数。不是一颗隐藏的珍珠,而是一颗崭新的珍珠。
回答
包含文件可以具有我们可以分配给变量的返回值。
// config.php return array( 'db' => array( 'host' => 'example.org', 'user' => 'usr', // ... ), // ... ); // index.php $config = include 'config.php'; echo $config['db']['host']; // example.org
回答
如果我们要使用注释来标记测试,数据提供者和数据驱动的测试等,建议使用PHPUnit进行单元测试。更不用说,当涉及到诸如持续集成(巡航控制,竹子,哈德森等)之类的东西时,它似乎获得了所有的集成爱。
PHP 5.3,这是一个巨大的飞跃,就语言功能而言,这是完全值得的。可能会有些粗糙,但这是一个初创公司,在我们启动时会修复它们。
就魔术方法而言,单独使用__invoke()是一件大事,但它却没有可逆的方法,即使如此,将其与array_map,array_reduce和array_filter配对,以及一些包装器,我们可以执行一些令人惊奇的功能编程。
get,set和__call也非常方便,我使用了这些以及一些接口/类命名约定技巧来实现5.3之前的特征,但现在我们也具有了特征。
还可以看看由ezComponents的derik rethans编写的附录库以及XDebug的声望,它允许我们为php 5+做注释。这还不错,并且性能与缓存无关。
对于分析,可以使用xdebug + webcachegrind。
最好的IDE可能是免费的eclipse PDT,如果我们在参数上使用类型提示,并在参数中使用phpdoc注释并返回,则可以从中找出问题并提供代码完成。那应该给你体面的智识。
顺便说一句,很想做各种各样的疯狂的字符串连接,变量变量,变量方法调用或者变量类创建,这些操作不只在一个地方进行,而且没有充分的文档证明,也很容易通过正则表达式进行搜索,因此拧紧。忘记调试困难,但是重构是一个主要的难题。人们很少认为这是php没有自动重构工具的原因,并且在php中很难重构大型代码库。
有几点警告我们,即使我们闻到了可能必须处理多字节字符或者"奇异"字符编码的可能性,我也强烈建议我们结束字符串处理。实际上,引入一个间接薄层可以使我们在代码和内置代码之间进行填充或者充当测试/可插入性的接缝,这将使生活更加轻松。这不是严格必要的,但是除非我们具有远见卓识,否则很难应对国际化或者如此庞大的跨领域项目。
自动加载,学习并喜欢它。避开硬编码的require / includes,或者更糟的是它们的* _once变体,它们在注入方面束手无策,而不是使用自动加载器,最简单的方法是将所有包含在数组中的东西塞住,键入类名,并且该值是从某个根开始的文件路径,速度很快。这样做的邪恶之处在于,它使测试变得非常容易,因为我们已经实现了类加载器,因此我们可以用它做一些非常整洁的事情。
PHP 5.3现在具有名称空间,可以高兴起来并像疯子一样使用它们。仅此一项就提供了创建接缝(稀有)以进行测试/注入的机会。
操作码缓存,文件访问很慢,为避免这种情况,请使用操作码缓存,这不仅是文件访问,还包括解析。如果我们不必解析PER请求,那么将有很大的不同。即使对前端控制器/拦截器执行此操作也会给我们带来很多好处。
换个角度来说,如果PHP程序员来自Java / .Net,那么最令人困扰的事情之一就是应用程序服务器分布在PHP / Apache或者我们正在使用的任何Web服务器上。
在早期,Phing / Ant / PHPMaven看起来似乎很简单,只是将所有内容塞入其中,但是构建脚本在php中仍然有用,并且它们具有强大的支持。
我在方法重载方面遇到了麻烦,但仍在与之抗衡。我想出了一种减轻其某些方面的模式。我经常有很多事情可以满足某个参数,因此,如果有可能,在将其记录为@param mixed(int | array | fooObject)时,我创建了一个称为Caster :: CastTo($ param,$ toTypeAsString)的静态方法。只会在匹配类型的情况下运行,并尝试将其转换为已知类型。然后,该方法的其余部分可以假定一种类型或者转换失败,然后使用该类型。而且由于我将所有转换都阻塞在一个类中,因此它避免了类型映射成为横切关注点,并且由于可以单独测试这些功能,因此我可以测试一次,并在其他任何地方都依赖它们。
回答
在PHP5.3中,我们可以将PHAR归档文件放入PHAR归档文件中!
就像Java世界中的WAR / EJB。
回答
这些年来,我的启示更多是概念性的,而不是基于语言的。
1:渲染而不是回显。
function render_title($title){ return "<title>$title</title"; }
在渲染输出而不是使用回声时,可以更轻松地重复使用这些零件并将它们传递到模板(在这种情况下,我们必须依靠输出缓冲)。
2:函数式编程,或者至少与我可能接近的那样,函数没有副作用。渲染(不使用全局变量)可以使函数具有局部作用域,诸如此类。我认为面向对象编程是在那里与php结合使用的一种方式,但是从php中从面向对象方法转换为函数式编程方法所经历的开销和语法复杂性的降低使函数式编程成为我的明确选择。
3:模板系统(例如smarty)。我花了很长时间才意识到,我们-needa模板系统已经是模板脚本语言的一部分,但是将逻辑与显示分离开来是非常必要的。
回答
ReflectionClass类提供有关给定类的信息。
$classInfo = new ReflectionClass ('MyClass'); if ($classInfo->hasMethod($methodName)) { $cm = $classInfo->getMethod($name); $methodResult = $cm->invoke(null); }
除其他外,对检查方法是否存在并调用它很有用。
回答
就像其他人提到的那样,在命令行级别运行PHP的能力非常棒。我一直将PHP脚本设置为cron作业,以进行数据清理和备份。只需使用以下几行启动文件:
#!/usr/bin/php5 <?php // start coding here
请注意,第一行可能会有所不同,具体取决于系统上PHP的安装位置。
从这里开始,很容易为较复杂的系统级进程(如守护程序)实现PHP。
回答
很多已经说过了。
补充一点,就是看起来很被遗忘(即使未被隐藏)的东西是http://www.php.net的http://talks.php.net的一部分。它收集了许多有用的演示文稿,其中有些确实很旧,但有些却非常有价值。
回答
我认为他们对GOTO功能的适当尊重是关键。
http://us2.php.net/goto
回答
预定义的接口:
http://php.net/manual/en/reserved.interfaces.php
例如,实现ArrayAccess
将使对象显示为数组,或者Iterator
将允许其在foreach语句中使用。
不幸的是,我们不能将"对象数组"与将数组作为参数的本机函数一起使用。
我还发现重写__call
函数很有用,该函数允许我们动态创建对象的属性和方法。
在我的数据库抽象中,我使用它来生成由数据库列名称命名的函数。例如,如果有一列"名称",那么我们可以使用" updateByName(" foo")"更改其中的值。
回答
另一个不错的功能是copy()。使用此功能可以从任何地方获取文件(甚至可以使用url)并将其复制到本地资源。因此,抓取文件变得非常容易。
回答
魔术方法__callStatic。
制作单例非常有用,例如PDO单例类
回答
有关原始帖子的问题:为什么要在PHP中重载方法,为什么需要switch语句?也许我们所说的"过载"一词与我从C ++中学到的不符。
至于PHP最喜欢的功能,我喜欢Exception对象。我发现拥有标准错误容器使将表示逻辑与业务逻辑脱钩变得更加容易,并且throw / catch语法使为每个类单独编写自动化测试变得更加容易。
回答
可堆叠的单位文件
<? // file unit1.php $this_code='does something.'; ?> <? // file unit2.php $this_code='does something else. it could be a PHP class object!'; ?> <? // file unit3.php $this_code='does something else. it could be your master include file'; require_once('unit2.php'); include('unit1.php'); ?> <? // file main.php include('unit1.php'); require_once('unit2.php'); require_once('unit3.php'); ?>
我故意将include和require_once互换使用,以表明可以做什么,因为它们的工作方式不同。
有多种方法可以构造代码或者将文件添加到代码中。甚至可以将HTML,AJAX,CSS,JAVASCRIPT,图像和所有类型的文件动态链接到代码中。
我特别喜欢它,因为也没有要求将包含/要求放在开头,中间或者结尾。根据用途,这可以提供更大的自由度。
回答
使用cURL设置测试套件,以驱动大型复杂的Web表单及其后端应用程序。至少在执行可接受的输入的每种组合方面,测试都是详尽无遗的。
回答
几乎可以包含任何文件类型,从.html到.jpeg。由PHP开放标记绑定的内部任何字节字符串都将执行。是的,goat.se的图像可以包含我们所有常用的实用程序功能。我猜想include的内部行为是将输入文件转换为字符串,并解析任何php代码。
回答
我们可以使用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
回答
我们可以在使用switch语句时对每个选项进行检查,这是一个示例:
$check = "HELLO"; switch ($check) { case (eregi('HI', $check)): echo "Write HI!"; case (eregi('HELLO', $check)): echo "Write HELLO!"; case (eregi('OTHER', $check)): echo "Write OTHER!"; }
再见...
回答
Lambda函数
多维数组中按字段排序的示例
function sort_by_field($field, & $data) { $sort_func = create_function('$a,$b', 'if ($a["' . $field . '"] == $b["' . $field . '"]) {return 0;} return ($a["' . $field . '"] < $b["' . $field . '"]) ? -1 : 1;'); uasort($data, $sort_func); }
匿名功能
匿名函数使我们可以将函数定义为变量。
http://www.php.net/manual/zh/functions.anonymous.php
回答
速记布尔链
<?php TRUE AND print 'Hello'; FALSE OR print 'World'; // Prints "Hello World"; // Complex example... User::logged_in() or die('Not allowed'); User::is_admin() AND print 'Admin Area';
如果我们可以通过网络访问区域中的PHP文件,这真的很有用。通过在每个文件的顶部插入这个小提示,可以确保除index.php之外没有人可以访问任何文件
<?php defined('YOURCONSTANT') or die('Not allowed'); ///rest of your code