当前位置:Gxlcms > PHP教程 > PHP5的部类约束

PHP5的部类约束

时间:2021-07-01 10:21:17 帮助过:6人阅读

PHP5的类型约束

PHP中函数参数有类型约束。那就是,明确要求参数的类型。比如以下代码:

?

?

  1. <!--?php
  2. //如下面的类
  3. class MyClass
  4. {
  5. /**
  6. * 测试函数
  7. * 第一个参数必须为类OtherClass的一个对象
  8. */
  9. public function test(OtherClass $otherclass) {
  10. echo $otherclass--->var;
  11. }
  12. /**
  13. * 另一个测试函数
  14. * 第一个参数必须为数组
  15. */
  16. public function test_array(array $input_array) {
  17. print_r($input_array);
  18. }
  19. }
  20. //另外一个类
  21. class OtherClass {
  22. public $var = 'Hello World';
  23. }
  24. ?>

?

那么,类型约束又有什么关系呢?这里有一个奇特的问题。那就是:

如果显式指定参数是某种类型的变量,则参加快PHP的程序效率。为什么呢?因为,反是对象,PHP5默认是以引用传递的。所以,public function test(OtherClass $otherclass) {
这行代码中,虽没有引用符号,实际也是引用传参。

那么,数组呢?因为,在PHP中我们面对的大数据的类型不外乎三类,对象,数组,字符串,而字符串是要明确在参数表中使用引用符号(&)的。

数组怎样,您试一下就明白了。所以,我不多说了!

?

当对象参数被加上类型约束后,仍可以有默认值,成为可选参数。如果这样,函数内部就要判断,传入参数是否为NULL。但一般是不需要使用 instanceof这个运算符了。 (此运算符比较特别,如果要否定,必须是?(!(A instanceod B))的形式。?)以下是有默认值的原码:

?

  1. <!--?php
  2. class ca{
  3. public $name='';
  4. }
  5. class cb{
  6. public $ca;
  7. public $color;
  8. public $array=array();
  9. //这里我们加上了类型约束,同时也给了默认值。但我们能发现,只有对象是以引用传递的
  10. function test($srcStr,$color,ca $ca = null,array $array=null){
  11. $this--->color=$color;
  12. $this->ca = $ca;
  13. $this->array = $array;
  14. $ca->name=$srcStr;
  15. print_r($this);
  16. }
  17. }
  18. $cat=new ca();
  19. $cbt=new cb();
  20. $cbt->test('test','red'); //这里我们可以不传对象
  21. $cbt->test('test','blue',$cat); //我们可以传对象,但数组仍不传
  22. print_r($cat);
  23. $cat1=new ca();
  24. $arr=array(1,2,3,4,5);
  25. $cbt->test('test','black',$cat1,$arr); //数组对象全部传入
  26. array_push($arr,6,7,8,9); //再改变数组
  27. print_r($cbt->array); //结果传入的数组未变。
  28. ?>

?

?

?

?

?

?

1 楼 dewei 2011-01-25

php5中,对象是不需要引用(&)的,大的数组是需要引用(&)的。

2 楼 tonyseek 2011-01-26

楼主说的类型约束好像也适用于PHP中的Interface

3 楼 renzhen 2011-05-20

dewei 写道

php5中,对象是不需要引用(&)的,大的数组是需要引用(&)的。


这个完全视乎你代码的需求,如果你希望函数内参数改变而函数外也变,那就用&,否则不用。
那如果函数内的参数数组不会改变呢?
其实加和不加都没什么关系。可能有人会说,不加应用不就是传值了吗,大的数组会浪费多少内存啊。
其实PHP 5已经对赋值实现了Zero on copy,简单点说,就是,如果将一个大数组a赋值给b,一开始它们指向的是同一个数组对象,内存不会成倍增加,只有当b改变了(加一个元素等操作),PHP底层才会先复制一个新的a数组,然后再做操作。
这种机制极大的提高了传值赋值的性能,基本上不会影响性能。
详细的信息可以去网上找。

4 楼 reeze 2011-06-02

对效率应该是没有影响的,非要对比,对类型的检查倒是增加了计算。

最明显的好处就是能约束接口的使用,减少手动类型检查的代码。能规范接口

5 楼 iminto 2011-06-27

bardo 写道

如果显式指定参数是某种类型的变量,则参加快PHP的程序效率。



?


说话要付责任的。

人气教程排行