ホームページ 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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

php5とphp8の違いは何ですか php5とphp8の違いは何ですか Sep 25, 2023 pm 01:34 PM

php5 と php8 の違いは、パフォーマンス、言語構造、型システム、エラー処理、非同期プログラミング、標準ライブラリ関数、セキュリティの点です。詳細な紹介: 1. パフォーマンスの向上. PHP5 と比較して、PHP8 はパフォーマンスが大幅に向上しています. PHP8 では、高頻度の実行コードをコンパイルおよび最適化できる JIT コンパイラーが導入されており、それによって実行速度が向上しています; 2. 言語構造の改善、 PHP8 では、いくつかの新しい言語構造と関数が導入されており、PHP8 では名前付きパラメータがサポートされており、開発者はパラメータの順序などの代わりにパラメータ名を渡すことができます。

Windows 11でネットワークの種類をプライベートまたはパブリックに変更する方法 Windows 11でネットワークの種類をプライベートまたはパブリックに変更する方法 Aug 24, 2023 pm 12:37 PM

ワイヤレス ネットワークのセットアップは一般的ですが、ネットワークの種類の選択または変更は、特に結果が分からない場合には混乱する可能性があります。 Windows 11 でネットワークの種類をパブリックからプライベートに、またはその逆に変更する方法についてのアドバイスをお探しの場合は、役立つ情報をお読みください。 Windows 11 のさまざまなネットワーク プロファイルとは何ですか? Windows 11 には、多数のネットワーク プロファイルが付属しています。これらのプロファイルは、基本的に、さまざまなネットワーク接続を構成するために使用できる設定のセットです。これは、自宅やオフィスに複数の接続がある場合に便利で、新しいネットワークに接続するたびにすべてを設定する必要がありません。プライベート ネットワーク プロファイルとパブリック ネットワーク プロファイルは Windows 11 の 2 つの一般的なタイプですが、一般的には

Python での動的配列の実装: 初心者から熟練者まで Python での動的配列の実装: 初心者から熟練者まで Apr 21, 2023 pm 12:04 PM

パート 1 Python シーケンス型の性質について話しましょう。このブログでは、Python のさまざまな「シーケンス」クラスと、一般的に使用される 3 つの組み込みデータ構造 (リスト、タプル、文字) について話します。文字列クラス (str) の性質)。お気づきかどうかはわかりませんが、これらのクラスには明らかな共通点があります。複数のデータ要素を保存するために使用できます。最も重要な機能は、各クラスがシーケンスの要素への添え字 (インデックス) アクセスをサポートしていることです。 SyntaxSeq[i] の使用など。実際、上記の各クラスは配列などの単純なデータ構造で表されます。ただし、Python に詳しい読者は、これら 3 つのデータ構造にいくつかの違いがあることをご存じかもしれません。たとえば、タプルと文字列は変更できませんが、リストは変更できます。

ビデオ マトリックス アカウントを作成するにはどうすればよいですか?どのようなタイプのマトリックスアカウントがありますか? ビデオ マトリックス アカウントを作成するにはどうすればよいですか?どのようなタイプのマトリックスアカウントがありますか? Mar 21, 2024 pm 04:57 PM

ショートビデオプラットフォームの人気に伴い、ビデオマトリックスアカウントマーケティングが新たなマーケティング手法となっています。企業や個人は、さまざまなプラットフォームで複数のアカウントを作成および管理することで、ブランドのプロモーション、ファンの増加、製品の販売などの目標を達成できます。この記事では、ビデオ マトリックス アカウントの効果的な使用方法について説明し、さまざまな種類のビデオ マトリックス アカウントを紹介します。 1. ビデオ マトリックス アカウントを作成するにはどうすればよいですか?優れたビデオ マトリックス アカウントを作成するには、次の手順に従う必要があります。 まず、ブランド コミュニケーション、ファンの増加、製品の販売など、ビデオ マトリックス アカウントの目標を明確にする必要があります。明確な目標を持つことは、それに応じた戦略を立てるのに役立ちます。 2. プラットフォームの選択: 対象視聴者に基づいて、適切なショートビデオ プラットフォームを選択します。現在主流のショートビデオプラットフォームには、Douyin、Kuaishou、Huoshan Videoなどが含まれます。

php5でポート80を変更する方法 php5でポート80を変更する方法 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 学習メモ: データ構造とアルゴリズムの概要: データ構造とアルゴリズムは、コンピューター サイエンスにおける 2 つの非常に重要な概念であり、問​​題を解決し、コードのパフォーマンスを最適化するための鍵となります。 PHP プログラミングでは、データを保存および操作するためにさまざまなデータ構造を使用する必要があり、さまざまな機能を実装するためにアルゴリズムも使用する必要があります。この記事では、一般的に使用されるデータ構造とアルゴリズムをいくつか紹介し、対応する PHP コード例を示します。 1. 線形構造配列 (Array) 配列は最も一般的に使用されるデータ構造の 1 つであり、順序付けされたデータを格納するために使用できます。

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