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

php5类型约束学习笔记

May 25, 2016 pm 04:49 PM
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);
?>
로그인 후 복사


文章链接:

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

php5와 php8의 차이점은 무엇입니까 php5와 php8의 차이점은 무엇입니까 Sep 25, 2023 pm 01:34 PM

php5와 php8의 차이점은 성능, 언어 구조, 유형 시스템, 오류 처리, 비동기 프로그래밍, 표준 라이브러리 기능 및 보안 측면에서 있습니다. 자세한 소개: 1. 성능 향상 PHP5와 비교하여 PHP8은 JIT 컴파일러를 도입하여 일부 고주파 실행 코드를 컴파일하고 최적화하여 실행 속도를 향상시킵니다. PHP8에는 몇 가지 새로운 언어 구조와 기능이 도입되었습니다. PHP8은 명명된 매개변수를 지원하므로 개발자는 매개변수 순서 대신 매개변수 이름을 전달할 수 있습니다.

Windows 11에서 네트워크 유형을 개인 또는 공용으로 변경하는 방법 Windows 11에서 네트워크 유형을 개인 또는 공용으로 변경하는 방법 Aug 24, 2023 pm 12:37 PM

무선 네트워크 설정은 일반적이지만 네트워크 유형을 선택하거나 변경하는 것은 특히 결과를 모르는 경우 혼란스러울 수 있습니다. Windows 11에서 네트워크 유형을 공개에서 비공개로 또는 그 반대로 변경하는 방법에 대한 조언을 찾고 있다면 몇 가지 유용한 정보를 읽어보세요. Windows 11의 다양한 네트워크 프로필은 무엇입니까? Windows 11에는 기본적으로 다양한 네트워크 연결을 구성하는 데 사용할 수 있는 설정 집합인 다양한 네트워크 프로필이 함께 제공됩니다. 이는 집이나 사무실에 여러 개의 연결이 있는 경우 유용하므로 새 네트워크에 연결할 때마다 이를 모두 설정할 필요가 없습니다. 개인 및 공용 네트워크 프로필은 Windows 11에서 두 가지 일반적인 유형이지만 일반적으로

Python에서 동적 배열 구현: 초보자부터 숙련자까지 Python에서 동적 배열 구현: 초보자부터 숙련자까지 Apr 21, 2023 pm 12:04 PM

1부 Python 시퀀스 유형의 특성에 대해 이야기해 보겠습니다. 이 블로그에서는 Python의 다양한 "시퀀스" 클래스와 일반적으로 사용되는 세 가지 내장 데이터 구조인 목록, 튜플 및 문자에 대해 이야기하겠습니다. ). 눈치채셨는지 모르겠지만 이러한 클래스는 여러 데이터 요소를 저장하는 데 사용할 수 있다는 분명한 공통점을 가지고 있습니다. 가장 중요한 기능은 각 클래스가 시퀀스 요소에 대한 아래 첨자(색인) 액세스를 지원한다는 것입니다. 예를 들어 SyntaxSeq[i]​를 사용하는 것입니다. 실제로 위의 각 클래스는 배열과 같은 간단한 데이터 구조로 표현됩니다. 그러나 Python에 익숙한 독자라면 이 세 가지 데이터 구조에 몇 가지 차이점이 있다는 것을 알 수 있습니다. 예를 들어 튜플과 문자열은 수정할 수 없지만 목록은 수정할 수 있습니다.

비디오 매트릭스 계정을 만드는 방법은 무엇입니까? 어떤 유형의 매트릭스 계정이 있습니까? 비디오 매트릭스 계정을 만드는 방법은 무엇입니까? 어떤 유형의 매트릭스 계정이 있습니까? Mar 21, 2024 pm 04:57 PM

짧은 비디오 플랫폼의 인기로 인해 비디오 매트릭스 계정 마케팅이 새로운 마케팅 방법으로 자리 잡았습니다. 다양한 플랫폼에서 여러 계정을 생성하고 관리함으로써 기업과 개인은 브랜드 홍보, 팬 성장, 제품 판매와 같은 목표를 달성할 수 있습니다. 이 기사에서는 비디오 매트릭스 계정을 효과적으로 사용하는 방법에 대해 설명하고 다양한 유형의 비디오 매트릭스 계정을 소개합니다. 1. 비디오 매트릭스 계정을 만드는 방법은 무엇입니까? 좋은 비디오 매트릭스 계정을 만들려면 다음 단계를 따라야 합니다. 먼저 브랜드 커뮤니케이션, 팬 성장 또는 제품 판매 등 비디오 매트릭스 계정의 목표가 무엇인지 명확히 해야 합니다. 명확한 목표를 갖는 것은 그에 따른 전략을 개발하는 데 도움이 됩니다. 2. 플랫폼 선택: 타겟 청중에 따라 적절한 짧은 비디오 플랫폼을 선택하십시오. 현재 주류 단편 비디오 플랫폼으로는 Douyin, Kuaishou, Huoshan Video 등이 있습니다.

Jul 24, 2023 pm 04:57 PM

php5에서 포트 80을 변경하는 방법: 1. Apache 서버 구성 파일에서 포트 번호를 편집합니다. 2. PHP가 새 포트에서 작동하도록 PHP 구성 파일을 편집합니다. 3. Apache 서버를 다시 시작하면 PHP 응용 프로그램이 실행됩니다. 새 포트에서 실행을 시작합니다.

PHP 연구 노트: 데이터 구조 및 알고리즘 PHP 연구 노트: 데이터 구조 및 알고리즘 Oct 09, 2023 pm 11:54 PM

PHP 연구 노트: 데이터 구조 및 알고리즘 개요: 데이터 구조와 알고리즘은 컴퓨터 과학에서 매우 중요한 두 가지 개념으로, 문제를 해결하고 코드 성능을 최적화하는 데 핵심입니다. PHP 프로그래밍에서는 데이터를 저장하고 조작하기 위해 다양한 데이터 구조를 사용해야 하는 경우가 많고, 다양한 기능을 구현하기 위해 알고리즘을 사용해야 하는 경우도 있습니다. 이 기사에서는 일반적으로 사용되는 데이터 구조와 알고리즘을 소개하고 해당 PHP 코드 예제를 제공합니다. 1. 선형 구조 배열(Array) 배열은 가장 일반적으로 사용되는 데이터 구조 중 하나이며 정렬된 데이터를 저장하는 데 사용할 수 있습니다.

Go 언어로 데이터베이스 기능을 배우고 PostgreSQL 데이터의 추가, 삭제, 수정 및 쿼리 작업을 구현합니다. Go 언어로 데이터베이스 기능을 배우고 PostgreSQL 데이터의 추가, 삭제, 수정 및 쿼리 작업을 구현합니다. Jul 31, 2023 pm 12:54 PM

Go 언어의 데이터베이스 기능을 배우고 PostgreSQL 데이터의 추가, 삭제, 수정 및 쿼리 작업을 구현합니다. 현대 소프트웨어 개발에서 데이터베이스는 없어서는 안 될 부분입니다. 강력한 프로그래밍 언어인 Go 언어는 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 쉽게 구현할 수 있는 풍부한 데이터베이스 작업 기능과 툴킷을 제공합니다. 이번 글에서는 Go 언어로 데이터베이스 기능을 익히고 PostgreSQL 데이터베이스를 실제 작업에 활용하는 방법을 소개합니다. 1단계: 각 데이터베이스에 대해 Go 언어로 데이터베이스 드라이버 설치

Golang 함수의 반환 값 유형은 무엇입니까? Golang 함수의 반환 값 유형은 무엇입니까? Apr 13, 2024 pm 05:42 PM

Go 함수는 다양한 유형의 여러 값을 반환할 수 있습니다. 반환 값 유형은 함수 시그니처에 지정되며 return 문을 통해 반환됩니다. 예를 들어, 함수는 정수와 문자열을 반환할 수 있습니다: funcgetDetails()(int,string). 실제로 원의 면적을 계산하는 함수는 면적과 선택적 오류 funccircleArea(radiusfloat64)(float64,error)를 반환할 수 있습니다. 참고: 함수 서명이 유형을 지정하지 않으면 null 값이 반환됩니다. 가독성을 높이기 위해 명시적인 유형 선언과 함께 return 문을 사용하는 것이 좋습니다.

See all articles