PHP的隐藏功能?

Hidden Features of PHP?

我知道这听起来像是一个关于嫖娼的问题,但让我解释一下我来自哪里。

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

然后,我在一家规模相当大的公司找到了一份一人内部开发公司的工作,所有的工作都在C完成。在我对这个职位的承诺中,我开始阅读大量的博客和书籍,并很快意识到我认为我无所不知是多么错误。我了解了单元测试、依赖注入和装饰器模式、松耦合的设计原则、关于继承的组合的争论等等——我仍然非常喜欢这一切。不用说,我的编程风格在去年完全改变了。

现在,我发现自己在挑选一个PHP项目,为一个朋友的初创公司做一些编码,我觉得自己完全被约束了,而不是用C语言编程。类范围中的所有变量都必须通过附加"$this->"来引用,这真的让我很困扰。让我恼火的是,我尝试过的所有IDE都没有很好的智能感知能力,我的SimpleTest单元测试方法都必须以"test"这个词开头。动态类型使我无法隐式地指定方法期望的参数类型,并且必须编写switch语句来执行方法重载,这让我疯狂。我不能忍受您不能有嵌套的命名空间,必须使用::运算符来调用基类的构造函数。

现在我不打算开始一场关于PHP与C的争论,而是我想说的是,我确信有一些PHP特性我不知道或不知道,但还不能正确使用。我置身于我的宇宙,在玻璃碗的外面看不见东西。

所以我想问,你最喜欢的PHP特性是什么?在.NET语言中,您可以做哪些您不能或更困难的事情?


文档。文件得到我的投票。对于一种编程语言,我还没有遇到更全面的在线文档——我必须从不同的网站和手册页上拼凑出所有其他内容。


数组。从这个问题的答案来看,我认为人们并不完全理解PHP中的数组是多么简单和有用。PHP数组同时充当列表、映射、堆栈和通用数据结构。数组是在语言核心中实现的,并且在所有地方都使用,这导致了良好的CPU缓存位置。Perl和Python都为列表和映射使用单独的语言构造,从而导致更多的复制和潜在的混淆转换。


流处理程序允许您使用逻辑扩展"文件系统",据我所知,在大多数其他语言中,这是相当困难的。

例如,使用MS Excel流处理程序,可以按以下方式创建MS Excel文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
$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);


当您调用一个不存在的方法,或者分配或读取一个不存在的属性,以及其他事情时,这些方法都会被调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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允许重载一些运算符,例如EDCOX1、0或EDCOX1×1。实际上,PHP允许更多的重载,例如[]操作符(arrayaccess)、foreach语言构造(迭代器和迭代器聚合)和count函数(countable)。


标准类是一个整洁的容器。我最近才知道。

而不是使用数组保存服务器属性

1
2
3
$person = array();
$person['name'] = 'bob';
$person['age'] = 5;

您可以使用标准类

1
2
3
$person = new stdClass();
$person->name = 'bob';
$person->age = 5;

在字符串中访问这些变量时,这尤其有用

1
2
3
$string = $person['name'] . ' is ' . $person['age'] . ' years old.';
// vs
$string ="$person->name is $person->age years old.";


include文件可以有一个返回值,您可以为变量赋值。

1
2
3
4
5
6
7
8
9
10
11
12
13
// config.php
return array(
    'db' => array(
        'host' => 'example.org',
        'user' => 'usr',
        // ...
    ),
    // ...
);

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


您可以利用or运算符的优先级低于=这样做:

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

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

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


__autoload()类文件,由set_include_path()辅助。

在php5中,在执行体面的OOP时,现在不需要指定"include_once"语句的长列表。

只需定义一组目录,在其中类库文件结构正常,并设置自动包含路径:

1
set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/');`

现在,__autoload()例行程序:

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


变量和函数毫无疑问!

1
2
3
4
5
6
7
8
9
10
11
12
13
$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产卵)更快、更容易控制。t


容易。最大的特点是新开发人员坐下来写"工作"脚本和理解代码是多么容易。

最糟糕的特性是,对于新开发人员来说,坐下来写"工作"脚本并认为他们理解代码是多么容易。

围绕PHP的社区的开放性以及作为开放源代码提供的大量PHP项目对进入开发世界的人来说是一个不那么可怕的威胁,就像你一样,可能是进入更成熟语言的一块踏脚石。

我不会像以前那样多地讨论技术问题,但是如果你把PHP看作是一个社区而不是一种网络语言,一个在你开始开发的时候就很清楚地拥抱你的社区,那么它的好处真的说明了它自己。


使用func_get_args()可以使用参数数目未定义的函数。

1
2
3
4
5
6
7
8
9
10
11
12
<?php

function test() {

    $args = func_get_args();
    echo $args[2]; // will print 'd'
    echo $args[1]; // will print 3
}

test(1,3,'d',4);

?>


我喜欢远程文件。对于Web开发,这种特性非常有用。

需要处理网页的内容吗?简单的

1
$fp = fopen('http://example.com');

你已经准备好了一个文件句柄,就像其他普通文件一样。

或者直接将远程文件或网页读取到字符串中如何?

1
$str = file_get_contents('http://example.com/file');

这种特殊方法的有效性很难夸大。

要分析远程图像吗?通过ftp怎么办?

1
$imageInfo = getimagesize('ftp://user:[email protected]/image/name.jpg');

几乎所有处理文件的PHP函数都可以处理远程文件。您甚至可以通过这种方式远程访问include()require()代码文件。


字符串()

它非常快,以至于你会惊讶。在内部,它可能使用一些疯狂的B-树类型结构,通过它们的公共前缀来安排匹配。我将它与200多个查找和替换字符串一起使用,但它仍然在不到100毫秒的时间内通过1兆字节。对于除微不足道的小字符串以外的所有字符串,strtr()在执行完全相同的操作时甚至比strtolower()快得多,即使考虑到字符集。您可以使用连续的strtr调用编写一个完整的解析器,它将比通常的正则表达式匹配速度更快,计算出令牌类型,输出这个或那个,下一个正则表达式类型。

我在写一个文本规范化器,用于将文本拆分为单词、降低词汇量、删除标点符号等,strtr是我的瑞士军刀,它可以将正则表达式甚至str ou replace()彻底击败。


PHP的一个不太知名的特性是extract(),它是一个将关联数组解包到本地名称空间的函数。这可能存在于自动全局堕胎,但对于模板化非常有用:

1
2
3
4
5
6
7
8
9
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


range()本身并不隐藏,但我仍然看到很多人在迭代:

1
2
3
for ($i=0; $i < $x; $i++) {
    // code...
}

当他们可以使用:

1
2
3
foreach (range(0, 12) as $number) {
    // ...
}

你可以做一些简单的事情,比如

1
2
3
4
5
foreach (range(date("Y"), date("Y")+20) as $i)
{
print"\t<option value="{$i}">{$i}</option>
"
;
}


启用了PHP的Web空间通常比使用(asp.net)的Web空间便宜。您可以称之为功能;-)


在OOP观点之外,static关键字是有用的。您可以使用以下简单的方法快速轻松地实现"memoization"或函数缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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(...)可能要好得多。


PHP的一个好特性是cli。文档中并没有这样"升级",但是如果您需要常规脚本/控制台应用程序,使用cron+php cli开发起来非常快!


然后"打印"技巧

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

如果$flag为真,将回响blah。不适用于Echo。

这对于模板和替换非常方便?:这不太容易阅读。


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

1
2
3
4
5
6
7
8
class style
{
  ....
  function set_bg_colour($c)
  {
    $this->{'background-color'} = $c;
  }
}

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


Heredoc语法是我最喜欢的隐藏功能。总是很难找到,因为你不能搜索<<但是它阻止了你必须避开大块的HTML并且仍然允许你把变量放到流中。

1
2
3
4
5
echo <<<EOM
 
    <img src="{$file}" />
 
EOM
;


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

1
2
3
4
function myFunc($param1, $param2 = MY_CONST)
{
//code...
}

字符串可以用作数组:

1
2
3
4
5
6
7
8
$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"


关于PHP代码最有用的一点是,如果我不太了解某个函数,我可以通过使用浏览器和键入来查找它:

http://php.net/function

上个月我在一些代码中看到了"range"函数。它是我尝试过的数百种功能中的一种,我从未使用过,但结果发现它确实很有用:

http://php.net/range

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

我希望其他语言、框架、数据库、操作系统都有一个简单的查找文档的机制。


快速块注释

1
2
3
4
5
6
7
8
/*
    die('You shall not pass!');
//*/



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

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


我的名单…他们中的大多数人更喜欢"隐藏的特性",而不是"最喜欢的特性"(我希望!)不是所有的都有用,但是……是啊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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');

你也可以嵌套三元运算符,有时也很有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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.

好的,我现在就停下来:—)

嗯,已经有一段时间了……

1
2
// just discovered you can comment the hell out of php:
$q/* snarf */=/* quux */$_GET/* foo */[/* bar */'q'/* bazz */]/* yadda */;

所以,刚刚发现,如果用大括号括起来,可以将任何字符串作为方法名传递。您不能将任何字符串定义为方法,但是您可以使用uuCall()捕获它们,并根据需要进一步处理它们。六羟甲基三聚氰胺六甲醚。。。。

1
2
3
4
5
6
7
8
9
class foo {
  function __call($func, $args) {
    eval ($func);
  }
}

$x = new foo;
$x->{'foreach(range(1, 10) as $i) {echo $i."
";}'
}();

在Reddit评论中发现了这个小宝石:

1
2
3
$foo = 'abcde';
$strlen = 'strlen';
echo"$foo is {$strlen($foo)} characters long."; //"abcde is 5 characters long."

不能像这样直接调用内部的函数,但可以使用保存函数名的变量并调用这些变量!(*和*您也可以在上面使用变量)


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

PHP作为一种语言是相当糟糕的,但是,我使用它的速度非常快,而且这个灯栈非常棒。最终产品远远超过各部分的总和。

回答你的问题:

网址:http://uk.php.net/spl

我喜欢SPL,C的收藏课是我一开始就喜欢的。现在我可以吃我的蛋糕了。

安得烈


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


我有点惊讶还没有人提到它,但我最喜欢的数组技巧之一是使用加号运算符。它有点像array_merge(),但有点简单。我发现这通常是我想要的。实际上,它获取了rhs中的所有条目,并使它们出现在lhs的副本中,根据需要覆盖(即,它是不可交换的)。对于从"默认"数组开始并在一次命中中添加一些实际值非常有用,同时保留未提供的值的默认值。

请求的代码示例:

1
2
3
4
5
6
7
8
// 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 );


下面是一个,我喜欢如何设置未提供的函数参数的默认值要容易得多:

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


默认为快速和脏。该语言充满了有用的快捷方式,这使得PHP成为(小)项目的完美候选,这些项目的上市时间很短。不是说干净的PHP代码是不可能的,它只是需要一些额外的努力和经验。

但我喜欢PHP,因为它可以让我表达我想要的东西,而不必打论文。

PHP:

1
2
3
if (preg_match("/cat/","one cat")) {
   // do something
}

爪哇:

1
2
3
4
5
6
import java.util.regex.*;
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat")
if (m.find()) {
  // do something
}

是的,这包括不输入int。


通过ob_start()进行输出缓冲比大多数人所认识到的要有用得多。这里的第一个隐藏特性是ob_start接受回调:

1
2
3
4
5
6
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);

其次,可以嵌套输出缓冲区…使用前面的示例:

1
2
3
4
5
6
7
ob_start(parseTemplate);
 // ...
 ob_start(twiterize);
   // ...
 ob_end_flush();
 // ...
ob_end_flush();

帮助内容、文本广告、字典/索引功能、链接、用于跟踪的链接重定向、模板引擎,通过使用这两种功能的不同组合,所有这些功能都非常简单。


可以使用break N;退出嵌套循环(以补偿缺少goto的情况)。例如

1
2
3
4
5
6
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


实际上,您并不是很正确,您不能指定一个方法期望的类型,它确实如您所期望的那样工作。

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

注意:这只适用于"数组"和对象名。

等等,您甚至可以按预期参数传入自己的类。用其他东西调用方法/函数将导致致命错误。

关于PHP中良好的智能感知的另一个提示。我们使用zendstudio,如果你为你的方法编写好的phpdocs,它实际上会更好地工作,它会在提示时研究这些。


对于基本字符验证,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...

< /块引用>


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


a)手册——非常全面、最新,只是解决问题时灵感的巨大来源——卡住了?浏览/搜索手册,就会找到你的。

b)数组-它们是塑料的,它们是关联索引的,它们可以很容易地嵌套!!)为了组成一些野生的数据结构,有许多仅用于数组操作的函数。哦,我有没有提到把单独的变量当作一个值数组?

c)eval()和类似的结构(如动态变量和函数名),允许更大的灵活性(如果您知道自己在做什么,那么仍然相对安全),没有什么比一个程序能够动态地定义自己的过程流(甚至是特定的执行)更好的了。

d)最容易忽略的事情可能是:由于zend引擎中的几乎所有内容都是zval(本质上是指针引用的集合),因此能够以函数返回值的形式返回任何内容。

另外,我想指出一个很好的特性,但它与PHP源代码的关系比语言的关系更大(因此单独列出):

e)编写C扩展的便利性(主要是针对其他对象的接口,如Openal或SDL)——伟大的源代码结构,以及"内部"上与"外部"上差不多多的强大工具——如果您需要进一步扩展功能的话。


除了即时访问外,还可以开始对网站所需的任何内容进行编码?

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

  • serialize/unserialize—通过SQL、cookies、进程、平面文件实现的状态保存优势。好东西。
  • json_encode/json_decode—即时Ajax乐趣
  • get_class—帮助那些疲乏、松散的打字时刻。
  • call_user_func_array-当您可以将代码作为字符串使用时,它是强大的(动态地考虑)
  • method_exists反射
  • func_num_args/func_get_arg未知参数ftw
  • set_error_handler/set_exception_handler—脚本语言非常好的调试功能

  • 几乎不应使用通过错误控制运算符@进行的错误抑制。它通过简单地忽略错误来促进懒惰和非防御的编码实践,因为所有类型的错误(甚至是致命的错误)都将被抑制,并且在某些情况下,可能会对性能造成影响(尤其是在抑制大量错误时)。


    滤波器变量功能。不是隐藏的珍珠,而是全新的。


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

    用MiniPHP和WinBinder做的。那是否足够隐蔽?我想没有多少PHP开发人员真正尝试过这种方法。


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

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

    元素可以是任何东西:对象、数组、标量…


    简写布尔链

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?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之外没有人可以访问任何文件。

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

    ///rest of your code


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

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

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

    从这里开始,很容易为更复杂的系统级进程(如守护进程)实现PHP。


    内置过滤器,用于根据特定的预定义类型分析变量,以及覆盖基本内容(int/float等),扩展到覆盖电子邮件、URL,即使变量是有效的正则表达式。

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


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

    1
    2
    3
    4
    5
    6
    $classInfo = new ReflectionClass ('MyClass');
    if ($classInfo->hasMethod($methodName))                                    
    {
      $cm = $classInfo->getMethod($name);                                  
      $methodResult = $cm->invoke(null);
    }

    除此之外,还可以检查方法是否存在并调用它。


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

    而不是写作

    1
    2
    3
    4
    5
    $newVar = $ar['foo']['bar'];
    echo"Array value is $newVar";

    $newVar = $obj->foo->bar;
    echo"Object value is $newVar";

    你可以写:

    1
    2
    echo"Array value is {$ar['foo']['bar']}";
    echo"Object value is {$obj->foo->bar}";


    排版和ctype_*功能对于确保数据的整洁变得非常重要。我最近广泛使用了异常,这大大简化了我的错误处理代码。

    我不认为这种语言有很多杀手的特征。(至少,我找不到太多机会去寻找他们。)我喜欢这种语言不引人注目。


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


    preg_split()、array_intersect()和array_intersect_key()。


    我也喜欢"和"的区别。

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

    因此,如果字符串不需要变量交换,就不要使用",这是浪费时间。我看到很多人在用"所有时间"来声明字符串。

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


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

    另外,通过在构造函数中设置标志来创建arrayaccess对象时,可以将对象作为数组或对象读写。下面是一个例子:

    1
    2
    3
    4
    5
    $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用户。必要时很容易得到答案和指导。


    控制结构的可选语法

    有很多人不知道这种语法。当我使用纯PHP进行模板化时,这种语法提供了一种将简单的控制结构(如ifforeach与HTML模板代码混合在一起的好方法,通常与短样式的打印变量结合在一起。


    specifying implicitly which parameter type a method expects

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

    1
    2
    3
    4
    class Bar
    {
        public function __construct(array $Parameters, Bar $AnotherBar){}
    }

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


    我建议在单元测试中使用phpunit,如果您希望有标记测试的注释、数据提供者和数据驱动测试等等。更不用说,当涉及到持续集成(巡航控制、竹子、哈德逊等)时,它似乎得到了所有集成的喜爱。好的。

    php 5.3,这是一个巨大的飞跃,在语言特性方面完全值得。它可能边缘粗糙,但这是一个启动,在您启动时它们将被修复。好的。

    就魔法方法而言,单独使用invoke()是一件大事,但它没有相应的方法,即使在那时,与array_map、array_reduce和array_filter以及一些包装器配合使用,您也可以进行一些惊人的功能编程。好的。

    _ get、set和call也非常方便,我使用这些和一些接口/类命名约定技巧来实现5.3之前的特性,但现在您也有了特性。好的。

    还有一个附录库,由ezcomponents的derik rethans和xdebug fame编写,它允许您为php 5+做注释。这还不错,缓存性能也不成问题。好的。

    对于分析,可以使用xdebug+webcacheGrind。好的。

    最好的IDE可能是免费的EclipsePDT,如果您对参数使用类型提示,并对参数使用phpDoc注释并返回,那么它可以从这些参数中找出问题并为您提供代码完成。这会给你很好的理解力。好的。

    顺便说一句,做各种疯狂的字符串concats,或者变量,或者变量方法调用,或者变量类创建都是很有诱惑力的,在不止一个地方这样做,这些地方没有很好的文档记录,而且很容易通过regex进行搜索,你就完蛋了。忘记调试很难,但是重构是一个主要的痛苦。这是人们很少认为PHP没有自动重构工具的事情,在PHP中重构大型代码库是非常困难的。好的。

    有几点要提醒您,即使您闻到了可能必须处理多字节字符或"异域"字符编码的一点点可能性,我强烈建议您总结字符串处理。事实上,引入一个很薄的间接层,它允许您在代码和内置模块之间填充或充当测试/可注入性的接缝,这将使您的生活更加轻松。不是严格必要的,但是除非你有远见的好处,否则很难应对国际化或如此大规模的跨领域项目。好的。

    自动加载,学习它并喜欢它。远离硬编码的需求/包含,或者更糟的是,它们的*一旦变种,它们就把你的手绑在注入方面,而使用自动加载程序,最简单的事情是把你的所有包含都塞进一个数组中,键入类名,值是来自某个根目录的文件路径,速度很快。最糟糕的是,它使测试变得非常简单,因为您已经实现了一个类加载器,所以您可以用它做一些非常好的事情。好的。

    php 5.3现在有了名称空间,高兴地跳起来,像疯子一样使用它们。仅此一项就为测试/注射创造了一个机会。好的。

    操作码缓存,文件访问很慢,为了避免它们,使用一个操作码缓存,这不仅仅是文件访问,而是所有的解析,真的。如果您不必对每个请求进行解析,那么这就有很大的不同。即使是为前端控制器/拦截器这样做也会给您带来很多好处。好的。

    如果PHP程序员来自Java/.NET,你的应用程序服务器遍布PHP/Apache或你使用的任何Web服务器,那就想一想,这是最令人费解的事情之一。好的。

    phing/ant/phpmaven在早期似乎很容易把所有东西都塞进,但是构建脚本在php中仍然很有用,它们有一些很好的支持。好的。

    我在方法重载方面遇到了困难,但仍然要处理它。我想出了一个模式来减轻它的某个方面。我经常有很多东西可以实现某个参数,所以当您将它记录为@param mixed(int array foobject)时,如果可能的话,我创建了一个名为caster::castto($param,$totypeasstring)的静态方法,它只需运行一个匹配类型的案例,并尝试将其转换为已知类型。然后,该方法的其余部分可以假定为一个类型,或者转换失败,并处理该类型。由于我在一个类中干扰了所有的转换,它停止了类型映射成为横切问题,而且由于这些函数可以单独测试,所以我可以测试它们一次,并在其他地方依赖它们。好的。好啊。


    我认为他们对goto函数的适当尊重是关键。

    http://us2.php.net/goto


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

    我现在正在努力学习Python(成长为…好。。程序员,可以吗?)而Python最有用的功能就是缩进。我喜欢php缩进,变量的$mark符号,循环和循环的大括号,好吧,这些聪明的东西使我的代码非常容易理解(即使编写代码的人很少..混乱..意大利面代码,mh?)

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

    数据库:MySQL、Postrge、SQL;几乎可以使用各种数据库。很容易。

    快速:逻辑上取决于代码的编写方式,但对于中小型应用程序来说,PHP通常速度相当快(因为它在更大的应用程序中失去了方向盘)。


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


    预定义接口:

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

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

    不幸的是,不能将"对象数组"与以数组为参数的本机函数一起使用。

    我还发现重写__call函数很有用,它允许您动态地为对象创建属性和方法。

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


    匿名函数

    示例-按多维数组中的字段排序

    1
    2
    3
    4
    5
    6
    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


    让我们看看…

  • 三元运算符。它们在处理表单结果中的复选框方面发挥了神奇的作用。

    $var=($_post['my_checkbox']='checked')?真:假;

  • 所有出色的字符串和数组处理功能都值得一探究竟。strtotime()、strlen()和strpos()是我的最爱。

  • simpleXML类和json_decode()函数。调用一个带有文件get_contents()的rest api或rss feed,用这些工具之一轻松地解析它,就完成了。


  • 找到与PHP相关的东西有多容易,例如,应用程序、类、文档、框架等…

    在整个网络上,当你(独自)去突击队的时候,它是最容易学习的语言,也是对你的时间更有价值的语言。

    在学习了PHP之后,可以将CMS与joomla、博客与wordpress等放在一起。


    可堆叠单元文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?
    // 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-switchable来显示可以做什么,因为它们的工作方式不同。

    有多种方法可以构造代码或将文件添加到代码中。甚至可以将HTML、Ajax、CSS、javascript、图像和各种文件动态链接到代码中。

    我特别喜欢它,因为在开始、中间或结束时也没有放置include/requires的要求。这允许更多的自由,这取决于使用。


    PHP中的json_编码/解码函数非常有用,尽管不是很隐蔽。


    当然是魔法和重载方法。Allain引用了uuGet()、uu set()、uu call()和u toString(),但我也喜欢uu wakeup()和uu sleep()。

    当对象被序列化(sleep)和反序列化(wakeup)时,将调用此魔力方法。此功能可以制作可序列化的数据库包装器,我在应用程序中使用:

    1
    2
    3
    4
    5
    6
    7
    8
    Class Connection {
       private $dsn;
       private $connection;
       ...
       public __wakeup() {
          $this->connection = ADONewConnection();
       }
    }

    这样我就可以在$u会话等中"保存"连接。


    好:

    • PHP在网络托管中的广泛应用。几乎每个Web托管服务都支持PHP。
    • 简单的事情可以用简单的代码来解决。不严格要求类或命名空间。

    坏的:

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


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

    1:渲染而不是回声。

    1
    2
    3
    function render_title($title){
         return"$title</title";
    }

    在呈现输出而不是使用Echos(在这种情况下,您必须依赖输出缓冲)时,重复使用部件并将它们传递给模板要容易得多。

    2:功能性编程,或者至少我能接近它,功能没有副作用。渲染,而不是使用全局,使您的函数具有局部作用域,诸如此类。我认为面向对象编程是一段时间内使用PHP的方法,但是我经历了从面向对象方法下降到PHP中的函数编程方法的开销和语法复杂性的减少,使得函数编程成为我的明确选择。

    3:模板系统(如smarty)。我花了很长时间才意识到,你需要一个模板系统,里面已经是一种模板脚本语言,但是逻辑与显示的分离是如此的必要。


    这是伟大的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //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.


    罗得已经说过了。

    另外一件看起来被遗忘了的事情,如果不是隐藏的话,那就是http://talks.php.net是http://www.php.net的一部分。它收集了很多有用的演示文稿,有些很旧,但有些是新的,非常有价值。


    在php5.3中,您可以将phar存档放在phar存档中!就像Java世界中的战争/EJB一样。


    关于原始日志的问题:为什么需要switch语句来重载PHP中的方法?也许你的意思是"过载"这个词与我从C++学到的不符。

    至于PHP最喜欢的特性,我喜欢异常对象。我发现拥有一个标准的错误容器可以更容易地将表示逻辑与业务逻辑分离开来,而throw/catch语法可以更容易地单独为每个类编写自动化测试。


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


    神奇的方法。

    对于制作单例非常有用,比如这个PDO单例类


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


    我喜欢PHP隐藏的特性:1。容易学习(也容易误用)。坏的编程习惯。就像你可以输入$something="1";然后你输入$something+=3;然后$something突然变成一个整数。无错误消息/异常异常,类似于Java中的错误消息

  • 很多图书馆。去phpclasses.org,我几乎从那里得到了一切。
  • 很多网站都在使用它。爱还是恨……事实就是这样!:)
  • 简单,体积小,易于维护。你只需在你的便携设备上安装Xampplite+Vim(我最喜欢)。
  • 便宜的!!!!像啤酒一样便宜…例如:托管。与Java或.NET主机相比,PHP主机非常便宜,你可以从一些网站获得免费的(虽然他们会在你的网站中放置一些横幅/隐藏的东西)。
  • PHP的文档非常好!!这是我坚持使用PHP大约6年的主要原因(尽管我使用groovy/grails做了一些项目)

  • 当使用switch语句时,可以对每个选项设置一个检查,这是一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $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!";
    }

    再见。。。


    Boolean Casting,这对Redwall_HP的第一个示例尤其有用。

    而不是:

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

    您可以键入:

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


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

    1
    2
    3
    4
    5
    6
    7
    function getInt(int $v)
    {
         echo $v;
    }

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