PHP的隐藏功能?

时间:2008-09-14 15:21:12

标签: php hidden-features

我知道这听起来像是一个让人尴尬的问题,但让我解释一下我来自哪里。

大学毕业后,我在PHP商店找到了一份工作。我在那里工作了一年半,并且认为我已经学会了所有有关编程的知识。

然后我在一家规模庞大的公司找到了一份独立内部开发工作室,所有工作都在C#中。在我对这个职位的承诺中,我开始阅读大量的博客和书籍,并很快意识到我认为我知道一切都是错的。我学习了单元测试,依赖注入和装饰模式,松散耦合的设计原则,继承辩论的组合等等 - 我仍然非常吸收它。毋庸置疑,我的编程风格在去年完全改变了。

现在我发现自己正在为一个朋友的初创公司做一些编码的PHP项目,我觉得完全受限制而不是用C#编程。让我感到困扰的是,必须通过追加'$ this->'来引用类范围内的所有变量。 。令我很生气的是,我尝试过的IDE中没有一个具有非常好的智能感知,而且我的SimpleTest单元测试方法必须从“测试”一词开始。令我疯狂的是,动态类型使我无法隐式指定方法所期望的参数类型,并且必须编写switch语句来执行方法重载。我不能忍受你不能拥有嵌套的命名空间,并且必须使用::运算符来调用基类的构造函数。

现在我无意启动PHP与C#的争论,而我的意思是说我确定有些PHP功能我不知道或者知道但是没有正确使用。我被安置在我的C#宇宙中,无法看到玻璃碗外面。

所以我问,你最喜欢的PHP功能是什么?你可以做些什么,你不能或更难以使用.Net语言?

78 个答案:

答案 0 :(得分:328)

<强>文档即可。 documentation获得了我的投票。我还没有遇到过更完整的编程语言在线文档 - 我需要从各种网站和手册页拼凑起来。

答案 1 :(得分:179)

<强>阵列即可。从这个问题的答案来看,我不认为人们完全理解PHP中的数组是多么简单和有用。 PHP数组同时充当列表,映射,堆栈和通用数据结构。数组在语言核心中实现,并在整个地方使用,从而产生良好的CPU缓存局部性。 Perl和Python都对列表和映射使用单独的语言结构,导致更多的复制和可能令人困惑的转换。

答案 2 :(得分:167)

流处理程序允许您使用逻辑扩展“FileSystem”,据我所知,在大多数其他语言中很难做到这一点。

例如,使用MS-Excel Stream handler,您可以通过以下方式创建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);

答案 3 :(得分:131)

Magic Methods 是每当您调用不存在的方法或分配或读取不存在的属性时调用的直接方法。< / p>

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语言结构(IteratorIteratorAggregate)和{{1功能(Countable)。

答案 4 :(得分:95)

标准类是一个整洁的容器。我最近才了解它。

而不是使用数组来保存多个属性

$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.";

答案 5 :(得分:90)

包含文件可以具有返回值,您可以将其分配给变量。

// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org

答案 6 :(得分:83)

您可以利用or运算符的优先级低于=来执行此操作的事实:

$page = (int) @$_GET['page'] 
  or $page = 1;

如果第一个赋值的值为true,则忽略第二个赋值。另一个例子:

$record = get_record($id) 
  or throw new Exception("...");

答案 7 :(得分:80)

set_include_path()辅助的

__autoload()(class-)文件。

在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将按需自动包含所需的文件,从而节省解析时间和内存。

答案 8 :(得分:76)

<强>容易性即可。最大的特点是新开发人员坐下来编写“工作”脚本并理解代码是多么容易。

最糟糕的特征是新开发人员坐下来编写“工作”脚本并认为他们理解代码是多么容易。

社区的开放性围绕PHP和大量可用作开放源代码的PHP项目对于进入开发世界的人来说并不像你一样令人生畏,可能成为迈向成功的基石更成熟的语言。

我不会像我之前那样讨论技术问题,但是如果你把PHP视为一个社区而不是一个网络语言,一个在你开始开发时明显拥抱你的社区,那么这些好处确实可以说明问题。 / p>

答案 9 :(得分:76)

变量和函数毫无疑问!

$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-&gt; $ some_variable);

非常非常好。使用循环和模式进行编码变得非常简单,并且它比eval更快更容易控制(Thanx @Ross&amp; @Joshi Spawnbrood!)。t

答案 10 :(得分:68)

您可以使用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);

?>

答案 11 :(得分:67)

我爱remote files。对于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()代码文件。

答案 12 :(得分:63)

strtr()

这是非常快的,你会感到惊讶。在内部,它可能使用一些疯狂的b树类型结构来按照它们的公共前缀排列匹配。我使用超过200个查找和替换字符串,它仍然在不到100毫秒内通过1MB。除了琐碎的小字符串之外,strtr()在执行完全相同的操作时甚至比strtolower()明显更快,甚至考虑到字符集。您可以使用连续的strtr调用编写一个完整的解析器,它比通常的正则表达式匹配更快,找出令牌类型,输出这个或那个,下一个正则表达式的东西。

我正在编写一个文本规范化器,用于将文本分成单词,小写,删除标点符号等,而strtr是我的瑞士军刀,它可以通过正则表达式甚至str_replace()击败裤子。

答案 13 :(得分:61)

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"出现在模板中。

答案 14 :(得分:52)

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";
}

答案 15 :(得分:44)

支持PHP的网站空间通常比使用(asp).net的网站便宜。 您可能称之为功能; - )

答案 16 :(得分:42)

{O} {@ 1}}关键字在OOP观点之外很有用。您可以使用以下简单的方法快速轻松地实现“memoization”或函数缓存:

static

<?php function foo($arg1) { static $cache; if( !isset($cache[md5($arg1)]) ) { // Do the work here $cache[md5($arg1)] = $results; } return $cache[md5($arg1)]; } ?> 关键字创建一个变量,该变量仅在执行后的该函数范围内持久存在。这种技术非常适合于在{(1}}或static等数据库中使用的功能,您可以在页面加载期间多次调用它。

警告:确保找到为哈希创建密钥的最佳方法,几乎​​在每种情况下get_all_books_by_id(...)都不是一个好的决定(速度和输出长度)问题),我用它来说明目的。 get_all_categories(...)md5(...)可能会更好,具体取决于具体情况。

答案 17 :(得分:42)

PHP的一个很好的功能是 CLI 。它在文档中并没有那么“提升”,但是如果你需要常规的脚本/控制台应用程序,那么使用cron + php cli的开发速度非常快!

答案 18 :(得分:40)

然后“并打印”技巧

<?php $flag and print "Blah" ?>

如果$ flag为真,将回显Blah。不与ECHO合作。

这在模板中非常方便并取代了? :这不是很容易阅读。

答案 19 :(得分:37)

您可以在变量名中使用减去字符,如下所示:

class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

为什么要用它?不知道:也许是CSS模型?或者你需要输出一些奇怪的JSON。这是一个奇怪的特征:)

答案 20 :(得分:34)

HEREDOC 语法是我最喜欢的隐藏功能。总是很难找到,因为你不能谷歌&lt;&lt;&lt;但是它阻止你必须逃避大量的HTML,并且仍然允许你将变量放入流中。

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;

答案 21 :(得分:34)

可能没有多少人知道可以将常量“变量”指定为函数参数的默认值:

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"

答案 22 :(得分:33)

PHP代码最有用的一点是,如果我不太了解某个函数,我会看到我可以通过使用浏览器并输入以下内容来查找:

  

http://php.net/function

上个月我在一些代码中看到了“范围”功能。它是我设法永远不会使用的数百个功能之一,但结果非常有用:

  

http://php.net/range

该网址是http://us2.php.net/manual/en/function.range.php的别名。 将功能和关键字映射到网址这个简单的想法非常棒。

我希望其他语言,框架,数据库和操作系统具有查找文档的简单机制。

答案 23 :(得分:30)

快速阻止评论

/*
    die('You shall not pass!');
//*/


//*
    die('You shall not pass!');
//*/

这些注释允许您在代码块被注释为一个字符时切换。

答案 24 :(得分:29)

我的列表..大多数人都比“最喜欢的功能”(“我希望!”)更多地属于“隐藏功能”,而且并非所有功能都有用,但是......是的。

// 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."

你不能像这样直接调用{}内的函数,但你可以使用variables-holding-the-function-name并调用它们! (*和*你也可以使用变量变量)

答案 25 :(得分:26)

我有点像你,我已经编写了超过8年的PHP编码。大约一年前我不得不参加.NET / C#课程,我非常喜欢C#语言(讨厌ASP.NET),但它让我成为了一个更好的PHP开发人员。

PHP作为一种语言非常差,但是,我非常快,LAMP堆栈非常棒。最终产品远远超过了各部分的总和。

那说,回答你的问题:

http://uk.php.net/SPL

我喜欢 SPL ,C#中的集合类是我一开始就喜欢的东西。现在我可以吃蛋糕了。

安德鲁

答案 26 :(得分:26)

数组操作。
大量用于处理和操作数组的工具。它可能不是PHP独有的,但我从来没有使用过这么简单的语言。

答案 27 :(得分:24)

我有点惊讶没有人提到它,但我最喜欢的数组之一是使用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 );

答案 28 :(得分:21)

这是一个,我喜欢如何设置未提供的功能参数的默认值更容易:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }

答案 29 :(得分:21)

快速而肮脏是默认设置 该语言充满了有用的快捷方式,这使得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

答案 30 :(得分:16)

通过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();

帮助内容,文字广告,字典/索引功能,链接,链接重定向以进行跟踪,模板引擎,通过使用这两件事的不同组合,所有这些都非常容易。

答案 31 :(得分:16)

您可以使用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

答案 32 :(得分:15)

实际上,你不能确定一个方法所期望的类型,它确实可以正常工作。

function foo ( array $param0, stdClass $param1 );

注意: 这仅适用于“数组”和对象名称。

依此类推,您甚至可以将自己的类传递给预期的参数。使用其他方法调用方法/函数将导致致命错误。

关于PHP中良好智能感知的另一个提示。我们使用ZendStudio,如果你为你的方法编写好的PHPDocs,它实际上会工作得更好,它会在提示时查看它们。

答案 33 :(得分:13)

除了即时访问以开始编码网站所需的任何内容之外?

除了魔术方法和反射之外,还有一些有趣的功能:

  1. serialize / unserialize - 通过sql,cookies,进程,flatfile保存状态良好。好东西。
  2. json_encode / json_decode - 即时AJAX乐趣
  3. get_class - 对那些疲惫松散的时刻有帮助
  4. call_user_func_array - 当你可以将代码作为字符串处理时,功能强大(想想动态)
  5. method_exists - 反思
  6. func_num_args / func_get_arg - 未知参数ftw
  7. set_error_handler / set_exception_handler - 非常好的脚本语言调试功能

答案 34 :(得分:13)

基本字符验证

Ctype functions比preg_match()更快。

  
    

ctype_alnum() - 检查字母数字字符
    ctype_alpha() - 检查字母字符
    ctype_cntrl() - 检查控制字符
    ctype_digit() - 检查数字字符
    ...等等...

  

答案 35 :(得分:13)

a)手册 - 非常全面,最新,只是一个巨大的灵感来源,同时解决问题 - 卡住了吗?浏览/搜索手册,它会来找你

b)数组 - 它们是塑料的,它们是关联索引的,它们可以很容易地嵌套(!)来组成一些野生数据结构,而且有很多函数只用于数组仅运营。哦,我是否提到将单独的变量视为值数组?

c) eval()和类似的结构(如动态变量和函数名称)允许更大的灵活性(如果您知道自己在做什么,仍然相对安全) - 没什么节拍一个基本上定义自己的流程(甚至特定执行)的程序

d)最容易被忽视的东西:因为ZEND引擎中的几乎所有内容都是 zVal (实质上是指针引用的集合),能够以任何方式返回任何内容函数返回值


另外,我想指出一个很棒的功能,但其中一个与PHP源代码相关的功能与语言相关(因此 - 单独列出):

e)编写 C扩展(主要是OpenAL或SDL等其他对象的接口)的简易性 - 很棒的源代码结构和'内部'上的强大工具一样多“外部” - 如果您需要进一步扩展功能。

答案 36 :(得分:13)

日期函数。我必须整天处理大量时间信息和日期字符串,因此像strftime()strtotime()这样的函数非常棒。

答案 37 :(得分:12)

通过error control operator, @进行的错误抑制几乎不会被使用。它通过简单地忽略错误来促进懒惰和非防御性编码实践,创建调试噩梦,因为所有类型的错误 - 甚至是致命错误 - 都将被抑制,并且在某些情况下,可能会导致性能下降(特别是在抑制大的时候)错误数量。)

答案 38 :(得分:12)

filter_var功能。不是隐藏的珍珠,而是新的。

答案 39 :(得分:10)

好吧,我最近向付费客户发送了我的第一个GUI应用程序 - 用PHP编写!它从条形码阅读器或GUI按钮,复选框,单选按钮或文本字段,商店到SQLite或远程MySQL收集数据,启动其他Windows应用程序,将压缩的XML报告作为电子邮件附件发送,加密和解密存储的数据,甚至播放声音完成后。

使用miniPHPWinbinder。这够隐藏吗?我想没有多少PHP开发人员真的尝试过这个。

答案 40 :(得分:8)

速记布尔链

<?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';

如果您在Web可访问区域中拥有PHP文件,那么这非常有用。通过在每个文件的顶部插入这个小花絮,您可以确保没有人可以访问任何文件,但index.php

<?php defined('YOURCONSTANT') or die('Not allowed');

///rest of your code

答案 41 :(得分:8)

正如其他人所提到的,在命令行级别运行PHP 的能力非常棒。我将PHP脚本设置为cron作业,以便始终进行数据清理和备份。只需使用以下行启动文件:

#!/usr/bin/php5
<?php
// start coding here

请注意,第一行可能会有所不同,具体取决于系统上PHP的安装位置。

从这里开始,很容易为更复杂的系统级进程实现PHP like daemons

答案 42 :(得分:8)

您可以轻松地将元素添加到数组中。

$my_array = array();
$my_array[] = 'first element';
$my_array[] = 'second element';

元素可以是任何东西:object,array,scalar ......

答案 43 :(得分:7)

内置过滤器,用于根据特定预定义类型解析变量 - 以及覆盖基础知识(int / float等),扩展到覆盖电子邮件,网址,甚至变量是有效的正则表达式。

http://ch2.php.net/manual/en/book.filter.php

答案 44 :(得分:6)

ReflectionClass类提供有关给定类的信息。

$classInfo = new ReflectionClass ('MyClass');
if ($classInfo->hasMethod($methodName))                                     
{
  $cm = $classInfo->getMethod($name);                                   
  $methodResult = $cm->invoke(null);
}

除此之外,检查方法是否存在并调用它是有用的。

答案 45 :(得分:6)

Typecastingctype_*函数对于确保数据清晰非常重要。我最近广泛使用了exceptions,这大大简化了我的错误处理代码。

我不会说这种语言有很多杀手锏。 (至少,我没有太多机会去找他们。)我喜欢这种语言不引人注目。

答案 46 :(得分:6)

在字符串中使用数组元素或对象属性。

而不是写

$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 :(得分:5)

preg_split(),array_intersect()和array_intersect_key()。

答案 48 :(得分:5)

几乎任何文件类型都可以是included,从.html到.jpeg。将执行在PHP开放标记内绑定的任何字节字符串。是的,goat.se的图像可以包含您所有常用的实用功能。我猜测include的内部行为是将输入文件转换为字符串,并解析任何PHP代码。

答案 49 :(得分:4)

The alternative syntax for control structures

有很多人不知道这种语法。当我使用纯PHP进行模板化时,这种语法提供了一种漂亮而简洁的方法,可以将简单的控制结构(例如ifforeach)与HTML模板代码混合使用,通常与<?= $myVar ?>短片结合使用打印变量的风格。

答案 50 :(得分:4)

如果您希望使用注释来标记测试,数据提供程序和数据驱动测试等,我建议使用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)只会运行匹配该类型的案例并尝试将其转换为已知类型。然后,该方法的其余部分可以假设一种类型,或者无法转换,并使用它。因为我把所有转换都塞进了一个类,所以它停止了对类型的映射,因为这些函数可以单独测试,我可以测试一次,并在其他地方依赖它们。

答案 51 :(得分:4)

标准PHP库中隐藏了许多宝石。数组访问允许您构建一个适用于数组接口但在顶部添加自己的功能的对象。

此外,当您通过在构造函数中设置标志来创建ArrayAccess对象时,您可以将对象读取和写入数组或对象。这是一个例子:

$obj = new ArrayObject(array("name"=>"bob", "email"=>"bob@example.com"),2);
$obj->fullname = "Bob Example";
echo $obj["fullname"];
$obj["fullname"]="Bobby Example";
echo $obj->fullname;

答案 52 :(得分:4)

我也喜欢'和'之间的区别。

$foo = 'Bob';
echo 'My name is {$foo}'; // Doesn't swap the variable
echo "My name is {$foo}"; // Swaps the variable

因此,如果你的字符串不需要变量交换,不要使用“,这是浪费时间。我看到很多人一直在声明字符串。

注意:我使用{}因为它使我的变量更加突出。

答案 53 :(得分:4)

我偏向那里的其他PHP用户。必要时,很容易得到答案和方向。

答案 54 :(得分:4)

  

隐式指定方法所期望的参数类型

实际上,这个部分是可能的(至少在PHP5中) - 您可以为函数和方法指定数组和对象参数的类型,尽管在标量类型的情况下你运气不好。

class Bar
{
    public function __construct(array $Parameters, Bar $AnotherBar){}
}

除了这个和Allain提到的神奇方法之外,我还发现SPL(标准PHP库)提供的接口是必不可少的 - 你可以在你的类中实现必要的方法,例如,我特别喜欢ArrayAccess和Iterator接口,允许使用类似关联数组的对象或像任何简单数组一样迭代它。

答案 55 :(得分:3)

嗯,社区对我来说是第一位的。 无论你的问题是什么,你总能找到一个曾经拥有它的人,而且几乎每次都有解决方案......有时候我会看到完全自由的想法,解决单一问题的方法。

我现在正在尝试学习Python(长大......好吧......程序员,可以吗?)而Python最有用的就是缩进。 我喜欢PHP缩进,用于签署变量的$ mark,用于循环和循环的花括号,以及那些聪明的东西让我的代码非常容易理解(即使编写代码的人很少......很高兴.. 'spaghetti-code',是吗?)

数组,在PHP中非常简单和强大。

数据库:MySQL,Postrgee,sql;你可以轻松地使用几乎所有类型的数据库。

快速:逻辑上取决于代码是如何编写的,但通常PHP对于小型/中型应用程序来说非常“强大”(因为它在更大的应用程序中失去了作用)。

答案 56 :(得分:3)

我认为他们对GOTO功能的正确尊重是关键。

http://us2.php.net/goto

答案 57 :(得分:3)

我已经开始切换到python,我在python中喜欢的一件事是实时解释器。直到后来在php项目上工作,我才意识到php确实有这个选项,但它并不广为人知。在命令提示符下,键入php -a并粘贴您要测试的任何PHP代码,但只记得以<?php

开头。

答案 58 :(得分:2)

Lambda函数

示例 - 在multidimension-array

中按字段排序
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/en/functions.anonymous.php

答案 59 :(得分:2)

让我们看看......

  1. 三元运营商。他们在表单结果中处理复选框时创造奇迹。

    $ var =($ _POST ['my_checkbox'] =='已检查')? TRUE:FALSE;

  2. 所有精彩的字符串和数组处理函数都值得一试。 strtotime(),strlen()和strpos()是我最喜欢的一些。

  3. SimpleXML类和json_decode()函数。使用file_get_contents()调用REST API或RSS提要,使用其中一个工具毫不费力地解析它,然后就完成了。

答案 60 :(得分:2)

预定义的接口:

http://php.net/manual/en/reserved.interfaces.php

例如,实施ArrayAccess会使您的对象显示为数组,或Iterator将允许它在foreach语句中使用。

不幸的是,您不能将“对象数组”与将数组作为参数的本机函数一起使用。

我还发现覆盖__call函数很有用,它允许您动态创建对象的属性和方法。

在我的数据库抽象中,我使用它来生成由数据库列名命名的函数。例如,如果列中有“名称”,则可以使用updateByName("foo")更改其中的值。

答案 61 :(得分:2)

找到PHP相关的东西非常容易实例,应用程序,类,文档,框架等......

在整个网络上,这是最容易学习的语言(自己动手),也是你的时间更有价值的语言。

学习PHP后,可能会将CMS与joomla,带有wordpress的博客等等放在一起......

答案 62 :(得分:1)

绝对是魔法和重载方法。 Allain引用__get(),__ set(),__ call()和__toString(),但我也喜欢__wakeup()和__sleep()。

当对象被序列化(休眠)和反序列化(唤醒)时,将调用此魔术方法。这个功能可以制作像我可以在应用程序中使用的可序列化数据库包装器:

Class Connection {
   private $dsn;
   private $connection;
   ...
   public __wakeup() {
      $this->connection = ADONewConnection();
   }
}

通过这种方式,我可以在$ _SESSION等中“保存”连接

答案 63 :(得分:1)

不可

  • WebHosting中PHP的广泛接受。几乎每个网络托管服务都有PHP支持。
  • 简单的事情可以通过简单的代码来解决。没有严格要求的类或命名空间。

<强> BAD:

  • 有很多函数没有任何命名约定。要有效地使用它,很难记住所有这些功能。
  • 整个网络编码习惯不好:(

答案 64 :(得分:1)

可堆叠的单位文件

<?
// 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,IMAGES和各种文件链接到您的代码中。

我特别喜欢它,因为也没有要求在开头,中间或结尾放置包含/要求。根据用途,这允许更多的自由度。

答案 65 :(得分:1)

php中的json_encode / decode函数非常有用,但不是很隐蔽。

答案 66 :(得分:1)

罗得已经说过这个了。

只是添加一个看起来很遗忘的东西,如果没有隐藏的话,http://talks.php.nethttp://www.php.net的一部分。它收集了大量有用的演示文稿,其中一些非常陈旧,但有些新的非常有价值。

答案 67 :(得分:1)

这很棒:

//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”文件是   仅包括如果doSomething获得   调用。课堂宣言,   funcs等,内部方法有效   完美。

答案 68 :(得分:1)

多年来我的启示比基于语言更具概念性。

1:渲染而不是回显。

function render_title($title){
     return "<title>$title</title";
}

在渲染输出而不是使用回声时,可以更容易地重复使用这些部件并将它们传递给模板(在这种情况下,您必须依赖输出缓冲)。

2:功能编程,或者至少尽可能接近它,功能没有副作用。渲染,不使用全局变量,保持函数具有局部范围,类似的东西。我认为面向对象编程是使用php一段时间的方法,但是从面向对象的方法下降到php中的函数式编程方法所体验到的开销和语法复杂性的降低使得函数式编程成为我的明智选择

3:模板系统(例如,聪明的)。我花了很长时间才意识到你需要一个已经是模板脚本语言的模板系统,但它给你的显示逻辑分离是如此,非常必要。

答案 69 :(得分:1)

在PHP5.3中,您可以将PHAR档案放在PHAR档案中! 就像java世界中的WAR / EJB一样。

答案 70 :(得分:0)

另一个不错的功能是copy()。此功能可以从任何地方(甚至URL工作)获取文件并将其复制到本地资源。所以抓取文件变得非常容易。

答案 71 :(得分:0)

魔术方法 __ callStatic

制作单身人士非常有用,例如PDO singleton class

答案 72 :(得分:0)

关于原帖的问题:为什么需要一个switch语句来重载PHP中的方法?也许你的意思是“重载”一词与我从C ++中学到的东西不符。

至于PHP的最爱功能,我喜欢Exception对象。我发现使用标准错误容器可以更容易地将表示逻辑与业务逻辑分离,而throw / catch语法使得为每个类单独编写自动化测试变得更加容易。

答案 73 :(得分:0)

使用cURL设置测试套件来驱动大型复杂的Web表单及其后端应用程序。测试是详尽无遗的 - 至少在执行可接受输入的每个组合方面。

答案 74 :(得分:-1)

我喜欢php的隐藏功能: 1.易于学习(也容易错过它..即:糟糕的编程习惯。就像你可以输入$ something =“1”;然后你做了$ something + = 3;然后突然$ something变成一个整数..没有错误消息/异常异常,如java中的那些

  1. 很多图书馆。去phpclasses.org,我几乎从那里得到了所有东西。
  2. 使用它的很多网站。喜欢它还是讨厌它......这就是事实! :)
  3. 简单,小巧,易于维护。你只需在便携式设备上安装xampplite + vim(我最喜欢的)。
  4. 便宜!!!像啤酒一样便宜......例如:托管。与java或.net主机相比,php主机非常便宜,你可以从一些网站免费获得一个(虽然他们会在你的网站上放一些横幅/隐藏的东西)
  5. php的文档非常好!!这是我坚持使用PHP大约6年的主要原因(尽管我使用Groovy / Grails做了一些项目)

答案 75 :(得分:-2)

使用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!";
}

...再见

答案 76 :(得分:-4)

布尔式强制转换,对于上面的redwall_hp的第一个示例特别有用。

而不是:

$var = ($_POST['my_checkbox']=='checked') ? TRUE : FALSE;

您可以输入:

$var = !!($_POST['my_checkbox']=='checked');

答案 77 :(得分:-5)

据我所知,你可以在函数调用中隐式参数类型:

function getInt(int $v)
{
     echo $v;
}

getInt(5); // will work
getInt('hello'); // will fail