recherche
Maisonphp教程php手册php5类型约束学习笔记

php是一种弱类型的编程语言,在php程序中,变量的数据类型可以随着其值的不同而自动发生改变,php也不会对变量的数据类型进行强制检查或约束.

我们可以参考下面一个简单的代码示例:

<?php
class Person {
}
$a = 1; //此时,$a为整数类型型(Integer)
var_dump($a);
$a = 1.0; //此时,$a为浮点类型(Float)
var_dump($a);
$a = &#39;CodePlayer&#39;; //此时,$a为字符串类型(String)
var_dump($a);
$a = array(
    &#39;CodePlayer&#39; => &#39;http://www.phprm.com&#39;
); //此时,$a为数组类型(Array)
var_dump($a);
$a = new Person(); //此时,$a为Person对象类型(Object)
var_dump($a);
$a = mysql_connect(&#39;localhost&#39;, &#39;username&#39;, &#39;password&#39;); //此时,$a为资源类型(Resource)
var_dump($a);
?>

php弱数据类型的特点使得php使用起来显得简单而灵活,不过,这同样也是一把达摩克利斯之剑,也正是由于php弱数据类型的特点,在编写php程序代码时,开发人员更需要时刻注意变量数据类型的变化,尤其是变量作为函数的参数进行传递时,更需要注意这一点,毕竟,大多数的函数参数都只期望是某种特定的数据类型,例如,在下面的例子中,函数sayHi()期望接收的参数类型是Person对象类型,但是,由于php并不是强类型的语言,也不会强制检查变量的类型,因此我们可以向函数中传递任意类型的参数,从而导致程序报错或逻辑出现异常,实例代码如下:

<?php
class Person {
    public $name = &#39;CodePlayer&#39;;
    public $age = 3;
}
function sayHi($person) {
    echo "Hello! My name is $person->name. I&#39;m $person->age years old.";
}
$p = &#39;张三&#39;;
sayHi($p); //不是期望的Person对象类型,将出现Notice级别错误信息,程序仍然继续运行
echo &#39;Suffix&#39;; //仍然会输出该文本信息
?>

从php 5开始,我们就可以使用新增的类型约束机制来对函数参数的部分数据类型进行类型约束。同样以上面的代码为例,我们可以在编写sayHi()函数时要求传递进来的参数必须是Person对象类型,否则引发致命错误(Fatal Error),并终止当前页面脚本的运行。要使用php的类型约束机制非常简单,我们只需要在函数声明的参数变量前添加指定的类型名称即可。当我们调用该函数时,php会强制检查函数的参数是否为指定的类型,如果不是指定的类型则引发致命错误,代码如下:

<?php
class Person {
    public $name = &#39;CodePlayer&#39;;
    public $age = 3;
}
function sayHi(Person $person) {
    echo "Hello! My name is $person->name. I&#39;m $person->age years old.";
}
$person = &#39;张三&#39;;
sayHi($person); //不是期望的Person对象类型,引发Fatal Error致命错误,程序终止运行
echo &#39;Suffix&#39;; //不会输出该文本信息,程序终止运行
?>

值得注意的是,在php 5中,目前只有对象、接口、数组、callable类型的参数变量才能使用类型约束(数组类型是从php 5.1版本开始支持的,callable类型是从php 5.4版本开始支持的)。

注意:如果使用类型约束的参数变量没有声明其默认值为null,调用该函数时就不能给对应的参数变量传递null值,否则同样也会报错。

类型约束不能用于标量类型如 int 或 string。Traits 也不允许。

Example #1 类型约束示例代码如下:

<?php 
//如下面的类 
class MyClass 
{ 
/** 
 * 测试函数 
 * 第一个参数必须为 OtherClass 类的一个对象 
 */ 
public function test(OtherClass $otherclass) { 
echo $otherclass->var; 
} 
 
/** 
 * 另一个测试函数 
 * 第一个参数必须为数组  
 */ 
public function test_array(array $input_array) { 
print_r($input_array); 
} 
} 
/** 
 * 第一个参数必须为递归类型 
 */ 
public function test_interface(Traversable $iterator) { 
echo get_class($iterator); 
} 
 
/** 
 * 第一个参数必须为回调类型 
 */ 
public function test_callable(callable $callback, $data) { 
call_user_func($callback, $data); 
} 
} 
// OtherClass 类定义 
class OtherClass { 
public $var = &#39;Hello World&#39;; 
} 
?>

函数调用的参数与定义的参数类型不一致时,会抛出一个可捕获的致命错误,代码如下:

<?php
// 两个类的对象
$myclass = new MyClass;
$otherclass = new OtherClass;
// 致命错误:第一个参数必须是 OtherClass 类的一个对象
$myclass->test(&#39;hello&#39;);
// 致命错误:第一个参数必须为 OtherClass 类的一个实例
$foo = new stdClass;
$myclass->test($foo);
// 致命错误:第一个参数不能为 null
$myclass->test(null);
// 正确:输出 Hello World
$myclass->test($otherclass);
// 致命错误:第一个参数必须为数组
$myclass->test_array(&#39;a string&#39;);
// 正确:输出数组
$myclass->test_array(array(
    &#39;a&#39;,
    &#39;b&#39;,
    &#39;c&#39;
));
// 正确:输出 ArrayObject
$myclass->test_interface(new ArrayObject(array()));
// 正确:输出 int(1)
$myclass->test_callable(&#39;var_dump&#39;, 1);
?>

类型约束不只是用在类的成员函数里, 也能使用在函数里, 代码如下:'

<?php
// 如下面的类
class MyClass {
    public $var = &#39;Hello World&#39;;
}
/** 
 * 测试函数
 * 第一个参数必须是 MyClass 类的一个对象
 */
function MyFunction(MyClass $foo) {
    echo $foo->var;
}
// 正确
$myclass = new MyClass;
MyFunction($myclass);
?>

类型约束允许 NULL 值:

<?php
/* 接受 NULL 值 */
function test(stdClass $obj = NULL) {
}
test(NULL);
test(new stdClass);
?>


文章链接:

随便收藏,请保留本文地址!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !

DVWA

DVWA

Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

mPDF

mPDF

mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) ​​et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),