174

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

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

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

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

现在我无意发起 PHP 与 C# 的辩论,而是我的意思是,我确信有一些 PHP 功能我不知道或知道但无法正确使用。我置身于我的 C# 世界中,在玻璃碗外面看不到东西。

所以我在问,你最喜欢 PHP 的哪些特性?您可以在其中做哪些在 .Net 语言中做不到或更困难的事情?

4

78 回答 78

328

文档文件得到我的投票。我还没有遇到过更全面的编程语言在线文档——我必须从各种网站和手册页拼凑起来的所有其他内容。

于 2008-09-14T17:32:25.703 回答
179

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

于 2008-09-15T16:33:28.847 回答
167

流处理程序允许您使用据我所知在大多数其他语言中很难做到的逻辑来扩展“文件系统”。

例如,使用MS-Excel 流处理程序,您可以通过以下方式创建 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);
于 2008-09-14T17:30:13.430 回答
131

魔术方法是在您调用不存在的方法或分配或读取不存在的属性时调用的贯穿方法,等等。

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 允许重载某些运算符,例如()or (string)。实际上 PHP 允许重载更多,例如[]运算符 ( ArrayAccess )、foreach语言构造 ( IteratorIteratorAggregate ) 和count函数 ( Countable )。

于 2008-09-14T17:21:29.083 回答
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.";
于 2008-11-01T07:42:37.170 回答
90

包含文件可以具有可以分配给变量的返回值。

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

// index.php
$config = include 'config.php';
echo $config['db']['host']; // example.org
于 2009-08-06T19:59:58.367 回答
83

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

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

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

$record = get_record($id) 
  or throw new Exception("...");
于 2009-02-09T01:51:15.890 回答
80

__autoload()(类)文件由set_include_path().

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

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

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

现在__autoload()例行公事:

function __autoload($classname) {
    // every class is stored in a file "libs/classname.class.php"

    // note: temporary alter error_reporting to prevent WARNINGS
    // Do not suppress errors with a @ - syntax errors will fail silently!

    include_once($classname . '.class.php');
}

现在 PHP 将自动按需包含所需的文件,从而节省解析时间和内存。

于 2008-10-02T18:31:32.333 回答
76

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

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

围绕 PHP的社区的开放性和大量可用的开源 PHP 项目对于进入开发世界的人来说并不那么令人生畏,并且像您一样,可以成为进入更成熟语言的垫脚石。

我不会像我之前那样讨论技术问题,但是如果您将 PHP 视为一个社区而不是一种 Web 语言,一个在您开始开发时就清楚地拥抱您的社区,其好处不言而喻。

于 2008-09-16T13:39:09.943 回答
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->$some_variable);

非常非常棒。使用循环和模式进行编码非常容易,而且它比 eval 更快、更受控制(感谢 @Ross 和 @Joshi Spawnbrood!).t

于 2008-09-15T12:51:35.870 回答
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);

?>
于 2009-07-09T12:24:41.120 回答
67

我喜欢远程文件。对于 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()这种方式远程编码文件。

于 2009-05-20T06:07:15.847 回答
63

strtr()

它非常快,以至于您会感到惊讶。在内部,它可能使用一些疯狂的 b-tree 类型结构来按照它们的公共前缀排列你的匹配项。我将它与 200 多个查找和替换字符串一起使用,它仍然在不到 100 毫秒的时间内通过 1MB。对于几乎很小的字符串,strtr() 在做完全相同的事情时甚至比 strtolower() 快得多,即使考虑到字符集也是如此。您可能可以使用连续的 strtr 调用编写整个解析器,它会比通常的正则表达式匹配更快,找出标记类型,输出这个或那个,下一个正则表达式类型的东西。

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

于 2009-03-20T09:51:16.810 回答
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"

于 2008-09-22T09:39:15.437 回答
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";
}
于 2009-06-22T11:52:18.193 回答
44

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

于 2008-09-14T20:15:51.520 回答
42

static关键字在 OOP 观点之外很有用。您可以使用以下简单的方法快速轻松地实现“记忆化”或函数缓存:

<?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(...)根据上下文可能会更好。

于 2009-06-21T22:29:09.403 回答
42

PHP 的一个不错的特性是CLI。它在文档中并没有那么“推广”,但是如果您需要常规脚本/控制台应用程序,使用 cron + php cli 的开发速度真的很快!

于 2009-01-11T07:25:39.237 回答
39

然后“和打印”技巧

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

如果 $flag 为真,将回显 Blah。不适用于 ECHO。

这在模板中非常方便,可以替换 ? : 这不是很容易阅读。

于 2008-10-06T11:11:23.727 回答
37

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

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

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

于 2009-05-01T08:20:02.157 回答
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"
于 2009-03-20T10:50:23.860 回答
34

HEREDOC语法是我最喜欢的隐藏特性。总是很难找到,因为你不能用谷歌搜索 <<<,但它阻止你不得不转义大块 HTML,并且仍然允许你将变量放入流中。

echo <<<EOM
  <div id="someblock">
    <img src="{$file}" />
  </div>
EOM;
于 2009-06-22T19:52:46.347 回答
33

关于 PHP 代码最有用的一点是,如果我不太了解我看到的函数,我可以使用浏览器并键入以下内容来查找它:

http://php.net/function

上个月我在一些代码中看到了“范围”函数。这是我设法从未使用过但非常有用的数百个功能之一:

http://php.net/range

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

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

于 2009-06-21T23:55:02.957 回答
30

快速块评论

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


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

这些注释允许您切换代码块是否用一个字符注释。

于 2009-06-21T02:24:00.870 回答
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 并调用它们!(*并且*您也可以在其上使用可变变量)

于 2009-06-21T22:43:32.760 回答
26

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

PHP 作为一门语言很差,但是,我对它的速度非常快,而且 LAMP 堆栈很棒。最终产品远远超过零件的总和。

也就是说,在回答您的问题时:

http://uk.php.net/SPL

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

安德鲁

于 2008-09-22T09:47:02.703 回答
26

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

于 2008-09-14T17:51:38.870 回答
24

我有点惊讶没有人提到它,但我最喜欢的数组技巧之一是使用加号运算符。它有点像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 );
于 2009-06-22T00:39:06.067 回答
21

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

但我喜欢 PHP,因为它可以让我表达我想要的东西,而无需写一篇文章。

PHP:

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

爪哇:

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

是的,这包括不输入Int

于 2009-02-16T01:19:55.233 回答
21

这是一个,我喜欢在未提供的函数参数上设置默认值更容易:

function MyMethod($VarICareAbout, $VarIDontCareAbout = 'yippie') { }
于 2008-09-14T15:22:38.120 回答
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();

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

于 2009-06-30T03:51:39.567 回答
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

于 2010-06-24T14:50:03.547 回答
15

实际上,您不能指定方法期望的类型并不完全正确,它确实按您期望的那样工作。

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

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

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

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

于 2008-09-14T19:15:01.167 回答
13

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

b)数组——它们是可塑性的,它们是关联索引的,它们可以很容易地嵌套(!)以组成一些狂野的数据结构,并且有许多函数仅用于数组操作。哦,我是否提到将单独的变量视为值数组?

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

d) 最容易忽略的事情:由于 ZEND 引擎中的几乎所有东西都是zVal(本质上是指针引用的集合),因此能够将任何东西作为函数返回值返回


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

e) 易于编写C 扩展(主要是其他对象的接口,如 OpenAL 或 SDL)- 出色的源代码结构和“内部”和“外部”一样多的强大工具 - 如果您需要扩展功能只是一点点。

于 2008-09-16T11:31:36.007 回答
13

日期函数。我必须整天处理大量时间信息和日期字符串,所以像strftime()strtotime()这样的函数真是太棒了。

于 2009-03-20T09:56:37.047 回答
13

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

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

  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- 非常好的脚本语言调试能力
于 2009-06-22T15:26:41.130 回答
13

对于基本字符验证, Ctype 函数比 preg_match() 更快。

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

于 2009-07-17T18:16:06.860 回答
12

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

于 2009-06-21T22:12:05.257 回答
12

filter_var函数。不是隐藏的珍珠,而是很新。

于 2009-07-25T23:06:09.977 回答
10

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

miniPHPWinbinder 做到了。够隐蔽吗?我想没有多少 PHP 开发人员真正尝试过这一点。

于 2009-07-01T01:43:24.820 回答
8

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

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

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

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

于 2009-11-08T19:56:35.190 回答
8

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

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

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

于 2009-04-27T17:24:03.803 回答
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
于 2010-06-28T23:19:21.113 回答
7

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

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

于 2008-09-22T09:52:09.850 回答
6

类型转换和ctype_ *函数对于确保数据干净变得很重要。最近我大量使用异常,这大大简化了我的错误处理代码。

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

于 2008-09-15T14:23:07.443 回答
6

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

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

除其他外,检查方法是否存在并调用它很有用。

于 2009-10-10T18:44:28.217 回答
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}";
于 2009-07-17T05:08:03.740 回答
5

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

于 2009-06-21T22:20:56.970 回答
5

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

于 2010-06-22T02:06:13.570 回答
4

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

于 2009-05-10T01:44:51.397 回答
4

There's lots of gems hidden in the Standard PHP Library. Array access allows you to build an object that works to an array interface but add your own functionality on top.

Also when you create an ArrayAccess object by setting a flag in the constructor you can read and write an object as either an array or an object. Here's an example:

$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;
于 2009-06-22T21:53:45.213 回答
4

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

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

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

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

于 2008-09-15T13:05:16.693 回答
4

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

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

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

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

于 2009-06-22T19:57:21.720 回答
4

控制结构的替代语法

很多人不知道这种语法。当我使用纯 PHP 进行模板时,这种语法提供了一种很好且干净的方式来混合简单的控制结构,例如HTML 模板代码ifforeach通常与<?= $myVar ?>打印变量的简短样式相结合。

于 2009-07-07T14:41:18.783 回答
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 中重构大型代码库非常困难。

有几件事要提醒你,即使你闻到一点点可能需要处理多字节字符或“异国情调”字符编码,我强烈建议你结束字符串处理。事实上,引入一层薄薄的间接层,允许您在代码和内置程序之间进行填充或充当测试/可注入性的接缝,这将使您的生活更轻松。不是绝对必要的,但除非你有远见,否则很难处理国际化或如此大型的跨领域项目。

自动加载,学习并喜欢它。逃避硬编码的要求/包含,或者更糟糕的是,它们的 *_once 变体,它们在注入方面束缚了你的手,而不是使用自动加载器,最简单的事情是将所有包含在一个数组中,键入类名,并且该值是来自某个根目录的文件路径,它很快。糟糕的是,它使测试变得非常容易,因为你已经实现了一个类加载器,所以你可以用它做一些非常整洁的事情。

PHP 5.3 现在有了名称空间,高兴地跳起来,像疯子一样使用它们。仅此一项就提供了为测试/注射创建接缝(罕见)的机会。

操作码缓存,文件访问很慢,为了避免它们,使用操作码缓存,它不仅仅是文件访问,而是所有的解析,真的。如果您不必解析 PER 请求,它会产生很大的不同。即使为前端控制器/拦截器执行此操作也会给您带来很多好处。

换个思路,如果 PHP 程序员来自 Java/.Net,最麻烦的事情之一是您的应用程序服务器分布在 PHP/Apache 或您正在使用的任何 Web 服务器上。

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

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

于 2009-08-18T17:29:51.990 回答
3

嗯,社区对我来说是第一位的。无论您的问题是什么,您总会找到以前遇到过问题的人,并且几乎每次都有解决方案……有时我会看到完全免费的想法,解决单个问题的方法。

我现在正在努力学习 Python(成长为......嗯......程序员,可以吗?)Python 最有用的就是缩进。我喜欢 PHP 的缩进,变量符号的 $ 标记,循环和循环的花括号,嗯,这些聪明的东西让我的代码很容易理解(即使编写代码的人很少..乱七八糟.. '意大利面条代码',嗯?)

PHP 中的数组非常简单且功能强大。

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

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

于 2009-03-20T16:36:54.417 回答
3

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

于 2009-07-23T18:21:11.913 回答
3

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

http://us2.php.net/goto

于 2010-01-09T05:34:06.440 回答
2

让我们来看看...

  1. 三元运算符。它们为处理表单结果中的复选框创造了奇迹。

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

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

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

于 2009-06-21T20:57:56.247 回答
2

查找与 PHP 相关的内容示例、应用程序、类、文档、框架等是多么容易……

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

学完 PHP 可能会把 CMS 和 joomla 放在一起,用 wordpress 写博客等等......

于 2008-09-15T18:21:22.207 回答
2

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

于 2010-06-28T21:00:08.370 回答
2

预定义接口:

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

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

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

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

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

于 2010-01-09T06:23:23.410 回答
1

Lot already said about this.

Just to add that one thing that looked pretty forgotten, if not hidden, is http://talks.php.net part of the http://www.php.net. It collects lot of useful presentations, some really old, but some new and extremely valuable.

于 2010-01-07T17:42:32.287 回答
1

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

1:渲染而不是回显。

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

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

2:函数式编程,或者至少尽可能接近它,没有副作用的功能。渲染,不使用全局变量,让你的函数保持在本地范围内,诸如此类。我曾一度认为面向对象编程是使用 php 的方式,但是我从面向对象方法下降到 php 中的函数式编程方法所经历的开销和语法复杂性的降低使得函数式编程成为我的明确选择.

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

于 2009-09-12T23:32:42.580 回答
1

好的:

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

坏的:

  • 有很多没有任何命名约定的函数。很难记住所有这些功能以有效地使用它。
  • 糟糕的编码习惯,遍布整个网络:(
于 2008-09-15T12:54:35.707 回答
1

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

于 2009-08-28T20:17:25.083 回答
1

绝对是魔术和重载方法。Alllain 引用了 __get()、__set()、__call() 和 __toString(),但我也喜欢 __wakeup() 和 __sleep()。

当对象被序列化(睡眠)和反序列化(唤醒)时,就会调用这个神奇的方法。这个特性能够制作像我在应用程序中使用的可序列化数据库包装器这样的东西:

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

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

于 2009-06-22T14:39:59.133 回答
1

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

于 2009-06-22T14:54:24.300 回答
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 和各种文件动态链接到您的代码中。

我特别喜欢它,因为也没有将包含/要求放在开头、中间或结尾的要求。这允许更大的自由度,具体取决于用途。

于 2010-01-29T11:02:34.503 回答
0

魔术方法__callStatic

制作单例真的很有用,比如这个PDO 单例类

于 2010-01-25T19:01:10.683 回答
0

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

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

于 2010-01-25T23:05:00.223 回答
0

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

于 2010-01-22T09:32:32.117 回答
0

这很棒:

//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 被调用时才包含。方法内部的类、函数等的声明完美地工作。

于 2009-06-22T01:07:27.570 回答
0

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

于 2010-02-23T20:39:30.643 回答
-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 做了一些项目)
于 2009-06-27T15:55:38.733 回答
-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!";
}

再见...

于 2010-06-28T20:32:44.770 回答
-4

Boolean casting, which is particularly helpful for redwall_hp's first example, above.

Instead of:

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

You can type:

$var = !!($_POST['my_checkbox']=='checked');
于 2009-06-22T05:51:07.807 回答
-5

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

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

getInt(5); // will work
getInt('hello'); // will fail
于 2009-06-22T14:34:54.263 回答