Home  >  Article  >  Backend Development  >  PHP v5.3 新特性

PHP v5.3 新特性

WBOY
WBOYOriginal
2016-06-13 12:29:331004browse

1)_callStatic() magic 方法

classFoo
{
    publicstaticfunction__callStatic( $name, $args)
    {
        echo"Called method $name statically";
    } 
 
    publicfunction__call( $name, $args)
    {
        echo"Called method $name";
    }
}

Foo::dog();       
// outputs "Called method dog statically"
$foo= newFoo;
$foo->dog();      
// outputs "Called method dog"

2)<span style="font-family:nsimsun">动态调用函数</span>

classDog
{
    publicfunctionbark()
    {
        echo"Woof!";
    }
<span style="color: #333399;">} 
 
$class= "Dog"
$action= "bark";
$x= new$class(); 
// instantiates the class "Dog"
$x->$action();     
// outputs "Woof!" </span>

3) 标准PHP库(SPL)

加了了少数几个容器类,比如,栈(SplStack)和固定数组(SplFixedArray)

$stack= newSplStack(); 
 
// push a few new items on the stack
$stack->push("a");
$stack->push("b");
$stack->push("c"); 
 
// see how many items are on the stack
echocount($stack); 
// returns 3 
 
// iterate over the items in the stack
foreach( $stackas$item)
    echo"[$item],";
// the above outputs: 1
 
 [/c],[b],[a]  
// pop an item off the stack echo $stack->pop(); // returns "c"   // now see how many items are on the stack echo count($stack); // returns 2

4) Closures 功能

关于Closures,这是一个把函数定义成变量的玩意。让我们看几个例子:

示例一:

$string= "Hello World!";
$closure= function() use($string) { echo$string; };
 
$closure();

Output:
Hello World!
示例二 使用引用的变量

$x= 1
$closure= function() use(&$x) { ++$x; }
 
echo$x. "\\n";
$closure();
echo$x. "\\n";
$closure();
echo$x. "\\n";

Output:
1
2
3
示例三,返回值

functiongetAppender($baseString)
{
      returnfunction($appendString) use($baseString)
  { return$baseString.$appendString; };
}

示例四,Reflection

classCounter
{
      private$x;
 
      publicfunction__construct()
      {
           $this->x = 0;
      }
 
      publicfunctionincrement()
      {
           $this->x++;
      }
 
      publicfunctioncurrentValue()
      {
           echo$this->x . "\\n";
      }
}
$class= newReflectionClass("Counter");
$method= $class->getMethod("currentValue");
$closure= $method->getClosure()
$closure();
$class->increment();
$closure();

Output:
0
1
示例五,Reflection API

$closure= function($x, $y= 1) {};
$m= newReflectionMethod($closure);
Reflection::export ($m);
<strong>Output</strong>:
Method [  publicmethod __invoke ] {
  - Parameters [2] {
    Parameter #0 [  $x]
    Parameter #1 [  $y]
  }
}

示例六,Uses Case

$logdb= function($string) { Logger::log("debug","database",$string);};
$db= mysqli_connect("server","user","pass");
$logdb("Connected to database");
$db->query("insert into parts (part, description) values
 ("Hammer","Pounds nails");
$logdb("Insert Hammer into to parts table");
$db->query("insert into parts (part, description) values
       ("Drill","Puts holes in wood");
$logdb("Insert Drill into to parts table");
$db->query("insert into parts (part, description) values
 ("Saw","Cuts wood");
$logdb("Insert Saw into to parts table");

更为详细的文章,请参考这里,链接。

5) 使用namespace

新版的PHP会开始支持C++式的namespace,请参看示例:

示例一

/* Foo.php */
<?php
namespaceFoo;
functionbar()
{
    echo"calling bar....";
}
?> 
 
/* File1.php */
<?php
include"./Foo.php";
Foo/bar(); 
// outputs "calling bar....";
?> 
 
/* File2.php */
<?php
include"./Foo.php";
useFoo asns;
ns/bar(); 
// outputs "calling bar....";
?> 
 
/* File3.php */
<?php
include"./Foo.php";
useFoo;
bar(); 
// outputs "calling bar....";
?>
<!--p include"./Foo.php"; useFoo; bar(); 
// outputs "calling bar....";-->

示例二,多重namespace

<!--p namespaceFoo; classTest {}  namespaceBar; classTest {}  $a= newFoo\\Test; $b= newBar\\Test;  var_dump($a, $b);--> <?php
namespaceFoo;
classTest {} 
 
namespaceBar;
classTest {} 
 
$a= newFoo\\Test;
$b= newBar\\Test; 
 
var_dump($a, $b); 
 
Output:
object(Foo\\Test)#1 (0) {
}
object(Bar\\Test)#2 (0) {
}
<strong>Output:</strong>
object(Foo\\Test)#1 (0) { }
object(Bar\\Test)#2 (0) { }

示例三,不同文件中的namespace

/*定义*/
/* global.php */
<?php
functionhello()
{
    echo"hello from the global scope!";
}
?> 
 
/* Foo.php */
<?php
namespaceFoo;
functionhello()
{
    echo"hello from the Foo namespace!";
}
?> 
 
/* Foo_Bar.php */
<?php
namespaceFoo/Bar;
functionhello()
{
    echo"hello from the Foo/Bar namespace!";
}
?>
<!--p namespaceFoo/Bar; functionhello() {     echo"hello from the Foo/Bar namespace!"; }-->
 
/*使用 */
<!--p include"./global.php"; include"./Foo.php"; include"./Foo_Bar.php"; useFoo;  hello();         
// outputs "hello from the Foo namespace!" Bar\\hello();   // outputs "hello from the Foo/Bar namespace!" \\hello();       // outputs "hello from the global scope!"--><?php
include"./global.php";
include"./Foo.php";
include"./Foo_Bar.php";
 
useFoo; 
 
hello();         
// outputs "hello from the Foo namespace!"
Bar\\hello();   
// outputs "hello from the Foo/Bar namespace!"
\\hello();       
// outputs "hello from the global scope!"
?>

更为详细的文章,请参考这里,链接。

6)开始支持Achieve包

正像JAR一样,PHP也要开始支持自己的Achieve包了,叫作,Phar。PHP提供了一整套函数来帮助开发人员创建和使用Phar,正如下面的示例所示:

创建

$p= newPhar("/path/to/my.phar",
 CURRENT_AS_FILEINFO | KEY_AS_FILENAME, "my.phar");
$p->startBuffering();

创建文件存根(stub)

$p->setStub("<!--p Phar::mapPhar();  include "phar:
//myphar.phar/index.php"; __HALT_COMPILER();-->");

加入文件

$p["file.txt"] = "This is a text file";
$p["index.php"] = file_get_contents("index.php");
$p["big.txt"] = "This is a big text file";
$p["big.txt"]->setCompressedBZIP2();
//加入某目录下所有的文件
$p->buildFromDirectory("/path/to/files","./\\.php$/");

使用Phar

include"myphar.phar";
include"phar://myphar.phar/file.php";

更为详细的文章,请参考这里,链接。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn