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

PHP v5.3 新特性

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-13 12:29:33
Original
1148 people have browsed it

1)_callStatic() magic 方法

1

2

3

4

5

6

7

8

9

10

11

12

classFoo

{

    publicstaticfunction__callStatic( $name, $args)

    {

        echo"Called method $name statically";

    }

  

    publicfunction__call( $name, $args)

    {

        echo"Called method $name";

    }

}

Copy after login

1

2

3

4

5

Foo::dog();      

// outputs "Called method dog statically"

$foo= newFoo;

$foo->dog();     

// outputs "Called method dog"

Copy after login

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

classDog

{

    publicfunctionbark()

    {

        echo"Woof!";

    }

<span style="color: #333399;">}

  

$class= "Dog"

$action= "bark";

$x= new$class();

// instantiates the class "Dog"

$x->$action();    

// outputs "Woof!" </span>

Copy after login

3) 标准PHP库(SPL)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

$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

Copy after login

4) Closures 功能

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

示例一:

1

2

3

4

$string= "Hello World!";

$closure= function() use($string) { echo$string; };

  

$closure();

Copy after login

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

1

2

3

4

5

6

7

8

$x= 1

$closure= function() use(&$x) { ++$x; }

  

echo$x. "\\n";

$closure();

echo$x. "\\n";

$closure();

echo$x. "\\n";

Copy after login

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

1

2

3

4

5

functiongetAppender($baseString)

{

      returnfunction($appendString) use($baseString)

  { return$baseString.$appendString; };

}

Copy after login

示例四,Reflection

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

Copy after login

Output:
0
1
示例五,Reflection API

1

2

3

4

5

6

7

8

9

10

$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]

  }

}

Copy after login

示例六,Uses Case

1

2

3

4

5

6

7

8

9

10

11

12

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

Copy after login

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

5) 使用namespace

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

示例一

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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

Copy after login

示例二,多重namespace

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<!--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) { }

Copy after login

示例三,不同文件中的namespace

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

/*定义*/

/* 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!"

?>

Copy after login

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

6)开始支持Achieve包

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

创建

1

2

3

$p= newPhar("/path/to/my.phar",

 CURRENT_AS_FILEINFO | KEY_AS_FILENAME, "my.phar");

$p->startBuffering();

Copy after login

创建文件存根(stub)

1

2

$p->setStub("<!--p Phar::mapPhar();  include "phar:

//myphar.phar/index.php"; __HALT_COMPILER();-->");

Copy after login

加入文件

1

2

3

4

5

6

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

Copy after login

使用Phar

1

2

include"myphar.phar";

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

Copy after login

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

Related labels:
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template