PHP 的隐藏特性?

我知道这听起来像是个无聊的问题但是让我解释一下我是从哪里来的。

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

然后我得到了一份工作,在一家大型公司的一个人的内部开发车间,所有的工作都是在 C # 。在我致力于这个职位的过程中,我开始阅读大量的博客和书籍,并很快意识到我认为自己什么都知道是多么的错误。我学习了单元测试、依赖注入和装饰模式、松散耦合的设计原则、关于组合优于继承的争论,等等等等——我仍然非常专注于这些。不用说,我的编程风格在去年已经完全改变了。

现在,我发现自己拿起一个 PHP 项目做一些编码的朋友的启动,我觉得完全约束,而不是在 C # 编程。类作用域中的所有变量都必须通过附加“ $this->”来引用,这确实让我感到困扰。我所尝试的 IDE 都没有很好的智能感知能力,而且我的 SimpleTest 单元测试方法必须以单词“ test”开头,这让我很恼火。动态类型使我无法隐式指定方法所期望的参数类型,而且必须编写 switch 语句才能执行方法重载,这让我抓狂。我无法忍受不能使用嵌套名称空间并且必须使用: : 操作符来调用基类的构造函数。

现在我不打算开始一场 PHP 与 C # 的辩论,我想说的是,我确信有一些 PHP 特性我不知道或不知道,但未能正确使用。我设置在我的 C # 宇宙中,在玻璃碗之外看东西有困难。

所以我问,你最喜欢 PHP 的哪些特性?有什么事情你可以做,你不能或更难在它。网络语言?

62713 次浏览

这里有一个,我喜欢没有提供的 设置函数参数的默认值如何更容易:

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

Magic Method 是秋季通过的方法,当您调用不存在的方法或分配或读取不存在的属性时,就会调用这些方法。

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语言结构(迭代器迭代聚合)和 count函数(可数)。

Stream Handlers 允许您使用逻辑来扩展“ FileSystem”,据我所知,这在大多数其他语言中是相当困难的。

例如,使用 流处理程序,你可以通过以下方式创建一个 MSExcel 文件:

$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 );

注意: 这只适用于“ array”和对象名。

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

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

启用 PHP 的 webspace 通常比使用(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 更快、更易于控制(Thanx@Ross &@Joshi Spawnbrood!).T

好:

  • PHP 在网络托管中被广泛接受,几乎所有的网络托管服务都支持 PHP。
  • 简单的事情可以用简单的代码来解决,不需要严格的类或者名称空间。

坏消息:

  • 有大量的函数没有任何命名约定。很难记住所有这些函数来有效地使用它。
  • 网络上到处都有不良的编码习惯: (

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

实际上,这是部分可能的(至少在 PHP5中)——您可以为函数和方法指定数组和对象参数的类型,但是在标量类型的情况下就不那么幸运了。

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

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

类型转换 Ctype _ * 函数对于确保数据清晰非常重要。我最近广泛使用了 例外,它极大地简化了我的错误处理代码。

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

数组 。从这个问题的答案来看,我认为人们并没有充分认识到 PHP 中的 Array 有多么简单和有用。PHP 数组同时充当列表、映射、堆栈和通用数据结构。数组在语言核心中实现,并在各处使用,从而产生良好的 CPU 缓存位置。Perl 和 Python 都对列表和映射使用单独的语言结构,从而导致更多的复制和潜在的混淆转换。

找到与 PHP 相关的东西是多么的容易,例如,应用程序,类,文档,框架等等。

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

在学习 PHP 可能会把 CMS 与 joomla,一个博客与 wordpress 等..。

A) 手动操作——非常全面、最新,是解决问题时获得灵感的巨大来源——卡住了?浏览/搜索使用手册,它就会出现在你面前

B) 数组-它们是塑料的,它们是联合索引的,它们可以很容易地嵌套(!)组成一些野生的数据结构,还有许多函数只用于数组操作。对了,我有没有提到过把单独的变量当作一个值数组来处理?

C) Eval ()和类似的结构(比如动态变量和函数名) ,它们允许更大的灵活性(如果你知道自己在做什么,它们仍然是相对安全的)——没有什么比一个程序在运行时基本上定义自己的流程流(甚至特定的执行)更好的了

D)可能是最容易被忽略的事情: 因为 ZEND 引擎中几乎所有的东西都是 ZVal(本质上是指针引用的集合) ,它能够以函数返回值的形式返回任何东西


另外,我想指出一个很棒的特性,但是这个特性与 PHP 源代码关系更大,而不是语言(单独列出) :

E)易于编写的 C 分机(主要是其他对象的接口,如 OpenAL 或 SDL)-伟大的源代码结构和大约有许多功能强大的工具在“内部”和在“外部”-如果你曾经需要扩展功能只是一点点进一步。

轻松。最大的特性是对于新开发人员来说,坐下来编写“工作”脚本并理解代码是多么容易。

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

围绕 PHP 的 社区的开放程度和大量作为开放源码提供的 PHP 项目对于进入开发领域的人来说没有那么吓人,而且像您一样,可以成为进入更成熟语言的踏脚石。

我不会像之前那样讨论技术问题,但是如果你把 PHP 看作一个社区,而不是一种网络语言,一个在你开始开发的时候就很欢迎你的社区,它的好处是不言而喻的。

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/C # 课程大约一年前,我真的很喜欢 C # 语言(讨厌 ASP.NET) ,但它使我成为一个更好的 PHP 开发人员。

PHP 作为一种语言是相当差的,但是,我对它非常敏捷,而且 LAMP 堆栈非常棒。最终结果远远大于各部分的总和。

也就是说,回答你的问题:

Http://uk.php.net/spl

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

安德鲁

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

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

__autoload() (class -)文件借助于 set_include_path()

在 PHP5中,现在不需要在进行体面的 OOP 时指定长长的“ include _ once”语句列表。

只需定义一小组目录,其中类库文件的结构是合理的,然后设置 auto include 路径:

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 为真,将回显 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("...");

Quick and ty 是默认值。
该语言充满了有用的快捷方式,这使得 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
}

是的,这包括不输入 内景

Strtr ()

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

我正在编写一个文本规范化程序,用于将文本分割成单词、小写、去除标点符号等。 strtr 是我的瑞士军刀,它打败了正则表达式甚至 str _ place ()。

日期功能 。我必须整天处理大量的时间信息和日期字符串,所以像 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 用户,在需要的时候很容易得到答案和方向。

我喜欢 < strong > 远程文件 。对于 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()代码文件。

快速块注释

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




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

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

让我想想..。

  1. 三元运算符。它们在处理表单结果中的复选框方面非常有用。

    $var = ($_ POST [‘ my _ checkbox’] = = ‘ check’)

  2. 所有出色的字符串和数组处理函数都值得深入研究。Strtotime ()、 strlen ()和 strpos ()是我最喜欢的几个。

  3. SimpleXML 类和 json _ decode ()函数。使用 file _ get _ content ()调用 REST API 或 RSS 提要,使用这些工具之一轻松地解析它,然后就完成了。

错误抑制通过 错误控制操作符@,应该几乎从来没有使用。它通过简单地忽略错误来促进懒惰和非防御性的编码实践,由于所有类型的错误——甚至是致命的错误——都将被抑制,从而导致调试噩梦,并且,在某些情况下,可能会对性能造成影响(特别是在抑制大量错误时)。

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

您不能像这样直接调用{}中的函数,但是您可以使用变量-hold-the-function-name 并调用它们!(* and * 也可以使用变量)

关于 PHP 代码最有用的一点是,如果我不完全理解一个函数,我可以使用浏览器查找它,然后输入:

Http://php.net/function

上个月我在一些代码中看到了“ range”函数。这是数百个我从未使用过的函数中的一个,但结果却非常有用:

Http://php.net/range

这个 url 是 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 _ special _ funs. inc”文件 < strong > 是 只包含 if doSomething gets 类的声明, 函数等等,内部方法工作 完美。

布尔类型转换,对于上面的 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 函数非常有用,尽管不是很隐藏。

除了即时访问开始编码远离任何你需要的网站?

除了神奇的方法和反射之外,还有一些有趣的函数:

  1. serialize /unserialize-通过 sql、 cookie、进程、平面文件保存好的状态。好东西。
  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-非常好的脚本语言调试能力

HEREDOC 语法是我最喜欢的隐藏特性。总是很难找到,因为你不能谷歌 < < ,但它停止你必须转义大块的 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"=>"bob@example.com"),2);
$obj->fullname = "Bob Example";
echo $obj["fullname"];
$obj["fullname"]="Bobby Example";
echo $obj->fullname;

我喜欢 PHP 隐藏的特性: 1.容易学(也容易误用)。.坏的编程习惯。比如你可以输入 $something = “1”然后你输入 $something + = 3然后突然 $something 变成了一个整数。.没有错误消息/奇怪的异常,就像 Java 中的那些一样)

  1. 很多图书馆。去 phpclasses.org,我几乎从那里得到了所有的东西。
  2. 很多网站都在使用它。喜欢它还是讨厌它... ... 这是事实! :)
  3. 简单,小巧,易于维护。你只需要在你的便携设备上安装 xampplite + vim (我的最爱)。
  4. 贱货! ! !像啤酒一样便宜... 比如: 招待。相比之下,爪哇或。Net host,php host 真的很便宜,你可以从一些网站免费获得一个(虽然他们会在你的网站内放置一些横幅/隐藏的东西)
  5. 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/${2}", $text);
}


ob_start(twiterize);

其次,您可以嵌套输出缓冲区... 使用前面的例子:

ob_start(parseTemplate);
// ...
ob_start(twiterize);
// ...
ob_end_flush();
// ...
ob_end_flush();

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

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

用的是 MiniPHPWinbinder。够隐蔽吗?我猜没有多少 PHP 开发人员真正尝试过这种方法。

控件结构的替代语法

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

可以使用 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 ()ーー检查字母数字字符
Ctype _ alpha ()ーー检查字母字符
Ctype _ cntrl ()ーー检查控制字符
Ctype _ digital ()ーー检查数字字符
等等。

我已经开始切换到 python,我喜欢 python 的一个特点就是现场解释器。直到后来在一个 php 项目中工作时,我才意识到 php 确实有这个选项,只是没有被广泛知道。在命令提示符中,键入 php -a并粘贴您想要测试的任何 php 代码,但是只要记住以 <?php开始就可以了

Include 文件可以有一个返回值 ,可以赋给变量。

// 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是一个巨大的飞跃,在语言特性方面非常值得。这可能有些粗糙,但这是一个初创公司,当你发布的时候他们已经修复好了。

就魔法方法而言,单独使用 _ _ emon ()是一个大问题,但是它没有对应的方法,即使是这样,与 array _ map、 array _ reduce 和 array _ filter 配对,还有一些包装器,你可以做一些惊人的函数式编程。

Get、 _ _ set 和 _ _ call 也非常方便,我在5.3之前使用了这些和一些接口/类变数命名原则的技巧来实现 trait,但是现在你也有 trait 了。

还可以看看 ezComponent 的 derik rethans 编写的附录库和 XDebug 名声,它允许您为 php 5 + 做注释。这还不错,而且缓存的性能也不是问题。

对于分析,可以使用 xdebug + webcache。

最好的 IDE 可能是免费的 eclipsePDT,如果您使用参数的类型提示和 phpdoc 参数注释并返回它可以从中找出问题并提供代码完成。这应该会让你有不错的智力。

顺便说一句,做各种疯狂的字符串连接,或变量变量,或变量方法调用,或变量类创建,都很诱人,在不止一个地方这样做,没有很好的文档说明,很容易通过正则表达式搜索,而且你是 SCREWED。忘记难以调试,但重构是一个主要的痛苦。人们很少认为 PHP 没有自动化的重构工具,而在 PHP 中重构大型代码库是非常困难的。

有几点需要提醒您,即使您觉得可能需要处理多字节字符或“异域”字符编码,我也强烈建议您结束字符串处理。事实上,引入一个薄的间接层,允许您在代码和内置代码之间夹缝或充当测试/可注入性的接缝,这将使您的生活更加轻松。严格来说没有必要,但是除非您具有远见卓识,否则很难处理国际化或如此大的交叉项目。

自动加载,学习并喜欢它。避开硬编码的 need/include,或者更糟糕的,它们的 * _ once 变体,它们在注入方面束缚了你的手脚,而是使用一个自动加载程序,最简单的事情就是干扰数组中的所有包含,键入类名,并且值是来自某个根的文件路径,它很快。这样做的缺点是它使测试变得非常容易,因为您已经实现了一个类装入器,所以您可以使用它来做一些非常简洁的事情。

PHP 5.3现在有名字空间了,高兴得跳起来,像个疯子一样使用它们。这本身就提供了一个机会,创造接缝(罕见)的测试/注射。

操作码缓存,文件访问很慢,为了避免这种情况,使用操作码缓存,这不仅仅是文件访问,这是所有的解析,真的。如果您不需要解析 PER 请求,那么会有很大的不同。即使是为前端控制器/拦截器这样做也会带来很多好处。

如果 PHP 程序员来自 Java/,那么他们最烦恼的事情之一就是不同的思维方式。Net 是指您的应用程序服务器分布在 PHP/Apache 或您正在使用的任何 Web 服务器上。

Phing/Ant/PHPMaven 早期似乎很容易将所有东西都塞进去,但是构建脚本在 php 中仍然很有用,并且它们有一些很好的支持。

我在方法重载方面遇到了麻烦,现在仍在与之抗争。我想出了一个模式来缓解它的某些方面。我经常有很多东西可以满足一个特定的参数,所以当你记录它@param mix (int | array | fooObject)时,如果可能的话,我创建了一个名为 Caster: : CastTo ($param,$toTypeAsString)的静态方法,它只是运行一个匹配类型的 case,并尝试将它转换成一个已知的类型。然后,方法的其余部分可以假定一种类型,或者转换失败,并使用该类型。由于我在一个类中干扰了所有的转换,它停止了类型映射的交叉关注,并且由于这些函数可以单独测试,我可以测试它们一次,并且在其他任何地方都依赖它们。

在 PHP5.3中,您可以将 PHAR 归档放在 PHAR 归档中! 就像 Java 世界中的 WAR/EJB。

多年来,我的启示更多的是概念上的,而不是语言上的。

1: 渲染而不是回声。

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

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

函数式编程,或者至少是我所能接近的,没有副作用的函数。呈现,不使用全局,将函数保持为局部作用域,诸如此类。我曾一度认为面向对象编程是使用 php 的一种方式,但是从面向对象方法到 php 中的函数式编程方法,我经历了开销和语法复杂性的降低,这使得函数式编程成为我的明确选择。

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

反射类类提供有关给定类的信息。

$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://talks.php.nethttp://www.php.net的一部分。它收集了很多有用的演示文稿,有些非常古老,但有些是新的,非常有价值。

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

Http://us2.php.net/goto

预定义的接口:

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

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

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

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

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

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

魔法 静电

非常有用的单件,像这个 单件类

关于原始文章的问题: 为什么需要 switch 语句来重载 PHP 中的方法?也许你所说的“过载”并不符合我从 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 和 request _ once 可以互换,以显示可以做什么,因为它们的工作方式不同。

有多种方法可以构造代码或将文件添加到代码中。甚至可以将 HTML、 AJAX、 CSS、 JAVASCRIPT、 IMAGES 和所有类型的文件动态地链接到代码中。

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

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

几乎任何文件类型都可以是 included,从。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/en/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';

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

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


///rest of your code