PHPのオーバーロードについて詳しく解説

小云云
リリース: 2023-03-22 20:20:01
オリジナル
3158 人が閲覧しました

PHP のオーバーロードは他のオブジェクト指向 (C#、Java) 言語とは異なります。たとえば、C# のオーバーロードはメソッド名は同じですが、仮パラメーター リスト (つまり、数値、型、および配列が異なります) 関数が異なります。呼び出し時の仮パラメータリストに基づいて、どのメソッドを呼び出すかが決定されます。

PHP でのオーバーロードは、現在のオブジェクトのアクセスできないメンバー (定義されていない、または定義されているがアクセスできない) を処理するためのものです:

<?php
	Class Student{
		private $_age;
	}
	$o1=new Student();
	$o1->_name="Li";
	var_dump($o1);
	echo "<br/>";
	$o1->_age=24;
	var_dump($o1);
 ?>
ログイン後にコピー

この結果から、存在しないメンバー $_name にアクセスする場合、メンバーはパブリック属性としてオブジェクトに追加されます。アクセス許可の問題になると、エラーが報告されます。

この状況に対して、PHP で属性のオーバーロードを行うための魔法のメソッドがいくつかあります。

属性のオーバーロード

1.__set($name,$value): 呼び出された特定の 属性がアクセスできない場合(存在しない / アクセスが制限されている) )、システムは対応するクラスの __set() 関数を自動的に呼び出します。 $name は呼び出される属性名を表し、$value は操作中に渡される値を表します。

属性が存在しない場合:

<?php
	Class Student{
		private $_age;
		function __set($name,$value){
			
		}
	}
	$o1=new Student();
	$o1->_name="Li";
	var_dump($o1);
ログイン後にコピー

ここで、上記の例にいくつかの変更を加えます: $o1->_name= の実行時に Student クラスに __set() メソッドを追加します。 Li ";このコードは自動的に __set() メソッドを呼び出します。コードが含まれていないため、デフォルトの状況と同じ割り当てを実現することは不可能です。そのため、表示される $o1 オブジェクトにはプライベート プロパティ $_age が 1 つだけあります。

このコードを __set() に記述することもできます。メソッド:

    function __set($name,$value){
$this->$name=$value;
}
ログイン後にコピー

この時点での結果は


属性が存在するがアクセスできない場合:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age;
		function __set($name,$value){
		//进入该函数表示$name 这个属性不可访问。
			if(property_exists($this,$name)){
				//property_exists()函数判断当前对象($this)中是否存在$name属性。
				trigger_error("属性不可访问!",E_USER_ERROR);
			}else{
				
			}
		}
	}
	$o1=new Student();
	$o1->_age=2;
	var_dump($o1);
ログイン後にコピー

2.__get(): はアクセスできないものにアクセスするとトリガーされますメンバー:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
		function __get($name){
		//进入该函数表示$name 这个属性不可访问。
			return $this->$name;
		}
	}
	$o1=new Student();
	echo $o1->_age;
	echo "<br/>";
	var_dump($o1);
ログイン後にコピー

3.__unset(): この関数は、変数が削除されたときにトリガーされます。

その具体的なアプリケーション シナリオ: 特定の変数を削除する unset() 関数はよく知られています。たとえば、上記の例では、$_age が public の場合、unset() を使用できます。 $o1 ->_age); ただし、ここでの $_age はプライベート属性であり、現時点では unset() を使用してアクセスできません。

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
	}
	$o1=new Student();
	unset($o1->_age);
ログイン後にコピー


これには、クラス内の属性の削除を実装する __unset() マジック メソッドが必要です:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		private $_age=23;
		function __get($name){
			return $this->$name;//正常应该有判断语句,这里省略了。
		}
		function __unset($name){
			unset($this->$name);
		}
	}
	$o1=new Student();
	echo $o1->_age;
	unset($o1->_age);
	echo $o1->_age;
ログイン後にコピー


特定のアプリケーションは、上記の __set() および __get() に似ています。 unset(変数名);すると__unset()メソッドが自動的に呼び出され、メソッド本体は自分で定義できます。

4.__isset(): __unset()と同様、主に属性の有無を判定するために使用されます。外部が属性の有無を判断したい場合、 isset() 関数を使用してプライベート変数にアクセスすることはできません。この場合、 __isset() メソッドを使用して定義できます。

オーバーロードされたメソッド

メソッドのオーバーロードと属性のオーバーロードの条件は同じです。存在しないメソッド、またはアクセスできないメソッドを呼び出す場合、__call() メソッドと Static__callStatic() メソッドが呼び出されます。

システムにデフォルトで存在しないメソッドを呼び出すと:

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		public static $a=1;
		private $_age=23;
	}
	$o1=new Student();
	$o1->getName();//当调用本不存在的方法时。
ログイン後にコピー

システムで重大なエラーが発生します。

__call(): オブジェクトを使って呼び出す場合に使用するマジックメソッド

<?php
header("Content-Type:text/html;charset=utf-8");
	Class Student{
		public static $a=1;
		private $_age=23;
		function __call($name,$arr){
			//$name表示传入的方法名,$arr表示传入的方法列表(是一个数组)。
			trigger_error("不存在该函数",E_USER_NOTICE);//直接报错
			//也可以在此重写函数。
		}
	}
	$o1=new Student();
	$o1->getName();//当调用本不存在的方法时。
ログイン後にコピー

Static__callStatic(): クラスの呼び出しメソッドを使用する場合、つまり存在しない静的メソッドを呼び出す場合にこのマジックメソッドが使用できます。

関連する推奨事項:

PHP でのオーバーロードの概要

JavaScript での関数のオーバーロードの詳細な説明

PHP でのオーバーロードとマジック メソッドの詳細な例

以上がPHPのオーバーロードについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート