`
bardo
  • 浏览: 380056 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11850
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10168
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9543
社区版块
存档分类
最新评论

PHP5的类型约束

    博客分类:
  • PHP
PHP 
阅读更多

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

 

 

<?php
//如下面的类
class MyClass
{
    /**
     * 测试函数
     * 第一个参数必须为类OtherClass的一个对象
     */
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }


    /**
     * 另一个测试函数
     * 第一个参数必须为数组 
     */
    public function test_array(array $input_array) {
        print_r($input_array);
    }
}

//另外一个类
class OtherClass {
    public $var = 'Hello World';
}
?> 

 

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

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

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

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

 

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

 

<?php

class ca{
    public $name='';
}

class cb{
    public $ca;
    public $color;
    public $array=array();
   //这里我们加上了类型约束,同时也给了默认值。但我们能发现,只有对象是以引用传递的 
   function test($srcStr,$color,ca $ca = null,array $array=null){
        $this->color=$color;
        $this->ca = $ca;
        $this->array = $array;
        $ca->name=$srcStr;
        print_r($this);
    }
}

$cat=new ca();
$cbt=new cb();


$cbt->test('test','red'); //这里我们可以不传对象
$cbt->test('test','blue',$cat); //我们可以传对象,但数组仍不传
print_r($cat); 
$cat1=new ca();
$arr=array(1,2,3,4,5);
$cbt->test('test','black',$cat1,$arr); //数组对象全部传入
array_push($arr,6,7,8,9); //再改变数组
print_r($cbt->array); //结果传入的数组未变。

?>

 

 

 

 

 

 

分享到:
评论
5 楼 iminto 2011-06-27  
<div class="quote_title">bardo 写道</div>
<div class="quote_div">
<p>如果显式指定参数是某种类型的变量,则参加快PHP的程序效率。</p>
</div>
<p> </p>
<p>说话要付责任的。</p>
4 楼 reeze 2011-06-02  
对效率应该是没有影响的,非要对比,对类型的检查倒是增加了计算。

最明显的好处就是能约束接口的使用,减少手动类型检查的代码。能规范接口
3 楼 renzhen 2011-05-20  
dewei 写道
php5中,对象是不需要引用(&)的,大的数组是需要引用(&)的。

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

相关推荐

    php中的类型约束类库

    5. PHP 7 引入的标量类型提示:在PHP 7中,为了增加类型安全,引入了对标量类型(如整型、浮点型、字符串和布尔型)的类型约束。例如: ```php function addNumbers(int $a, int $b): int { return $a + $b; } ```...

    php中的类型约束类.zip

    主要介绍了PHP中的类型约束介绍,PHP的类方法和函数中可实现类型约束,但参数只能指定类、数组、接口、callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型,需要的朋友可以参考下。

    php 值类型包装

    然而,需要注意的是,PHP作为动态类型语言,类型约束并不像静态类型语言那样强制执行,如果在运行时传入了不符合类型约束的参数,PHP会尝试进行类型转换,这可能导致意外的行为或错误。因此,开发者在使用值类型包装...

    PHP类型约束用法示例

    PHP类型约束是PHP 5.0以上版本支持的特性,它允许开发者在函数或方法定义时对参数类型做出限制,确保传入的数据类型符合预期,从而提高代码的安全性和可读性。本文将详细介绍PHP类型约束的用法,并通过具体实例来...

    PHP中的类型约束介绍

    主要介绍了PHP中的类型约束介绍,PHP的类方法和函数中可实现类型约束,但参数只能指定类、数组、接口、callable 四种类型,参数可默认为NULL,PHP并不能约束标量类型或其它类型,需要的朋友可以参考下

    PHP面向对象类型约束用法分析

    PHP面向对象编程中的类型约束主要用于增强代码的健壮性和可读性。类型约束是编程语言中用于确保函数或方法参数符合指定类型的机制。在强类型语言中,如Java或C#,类型约束是必不可少的特性,因为它们要求变量在使用...

    MySQL所支持的数据类型与表字段约束类型的学习教程

    在PHP中,通常使用UNIX时间戳(int类型)配合PHP时间函数进行处理。 4. **其他类型**: - **二进制类型**:如binary和varbinary,用于存储二进制数据。 - **枚举和集合类型**:enum和set,用于限制字段值在一个...

    PHP5 MYSQL5 (中文) 手册打包下载

    PHP5是PHP的一个重大升级版本,引入了诸多新特性和改进,例如:面向对象编程的支持加强、错误处理机制的改善、类型提示的引入等。它在性能、稳定性和安全性上都有显著提升,为开发者提供了更强大的工具。 MySQL则是...

    在用户空间中改进PHP的类型系统泛型类型列表元组和结构

    不过,有一些库如`spl_types`或`splat/php-typing`提供了模拟泛型的方式,通过自定义类和接口来实现对类型约束的控制。例如,`spatie-typed`这个库可能就是这样一个工具,它可能包含了用于创建泛型容器的类和方法。 ...

    php5Mysql 电子文档

    1. PHP5基础:包括PHP5的安装配置、基本语法、变量类型、流程控制(如条件语句和循环)、函数定义与调用、数组操作等。 2. 面向对象编程:PHP5引入了完整的面向对象特性,如类、对象、继承、封装、多态性等,这是...

    PHP5 MySQL 编程入门(PDF)

    5. **存储引擎**:如InnoDB支持事务处理和外键约束,MyISAM则强调速度但不支持事务。 **PHP5连接MySQL** 1. **mysqli扩展**:提供连接、查询、结果处理等功能,支持预处理语句,提高了安全性。 2. **PDO_MySQL**:...

    PHP5_CI_MYSQL_guide.rar_PHP5.chm

    【PHP5.chm】 PHP5是PHP编程语言的一个重要版本,它引入了许多新特性,增强了性能和稳定性。在PHP5中,面向对象编程得到了显著加强,包括类、对象、继承、封装和多态等核心概念。此外,错误处理机制得到改进,引入了...

    Beginning PHP and MySQL 5

    MySQL部分将涵盖数据库设计,包括如何创建数据库、表,定义字段类型和约束。读者将学习SQL语言,包括SELECT查询用于检索数据,INSERT用于插入新记录,UPDATE用于修改现有记录,以及DELETE用于删除记录。还会讨论更...

    PHP的面向对象的选项解析器库,支持类型约束,标志,多个标志,多个值,必需的值检查-PHP开发

    GetOptionKit代码质量版本和统计信息一个功能强大PHP选项解析器工具包,支持类型约束,标志,多个标志,多个值和必需的值检查。 GetOptionKit支持PHP5.3,wi GetOptionKit代码质量版本和统计信息一个强大PHP选项解析...

    mysql5和php5手册

    PHP 5 的主要改进在于面向对象编程(OOP)的支持,错误处理和类型系统的增强。以下是关键知识点: 1. **面向对象编程**:PHP 5 引入了类、对象、继承、封装和多态等 OOP 基础概念,提高了代码的可维护性和重用性。 ...

    php6 mysql5 for dynamic websites

    2. 数据类型和约束:了解各种数据类型(如INT、VARCHAR、DATE等)及其适用场景,以及如何设置字段的约束条件。 3. 关系数据库设计:理解范式理论,进行数据库规范化设计,避免数据冗余和不一致。 4. 查询优化:如何...

    PHP5与MYSQL5 WEB开发详解源码2

    5. **外键约束**:确保数据的引用完整性,防止不一致的数据库状态。 结合这两个技术,Web开发者可以创建动态、数据驱动的网站。在“website2”源码中,可能涵盖了用户注册登录系统、内容管理、数据检索和展示、以及...

Global site tag (gtag.js) - Google Analytics