首页 后端开发 php教程 PHP面向对象编程——特殊实践DAY 4

PHP面向对象编程——特殊实践DAY 4

Jul 29, 2016 am 09:15 AM
function name public quot

面向对象特殊实践
(只有在PHP里面才有,其他语言面向对象没有)
面向对象--魔术方法
__construct(), __destruct() 构造函数和析构函数
__tostring()
__invoke()
__call(), __callStatic()
__get(), __set(), __isset(), __unset()
__clone()
__tostring()
对象被当作String使用时,这个方法会被自动调用。
Echo $obj;
__invoke()
对象被当成方法调用时,这个方法会被自动调用

$obj(4);

<?php class MagicTest{

	//__tostring会在把<strong>对象转换为string的时候自动调用
	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	// __invoke会在把<strong>对象</strong>当作一个方法调用的时候自动调用
	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}
}

$obj = new MagicTest();
echo $obj."\n";
$obj(5);

?>
登录后复制

output:
This is the Class MagicTest.
__invoke called with parameter 5

__call()
对象访问不存在的方法名称时,__call()方法会被自动调用
__callStatic()
对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用
这两个方法在PHP里面也被成为方法的重载(overloading)
注意区分重写(overwrite)
通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现

<?php class MagicTest{

	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}

	//方法的重载
	//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling " . $name . " with parameters: ".
			implode(",", $arguments)."\n";

	}

	//<strong>静态方法的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static Calling " . $name . " with parameters: ".
			implode(",", $arguments)."\n";

	}
}

$obj = new MagicTest();

//runTest这两个方法的名称本来不能完全相同,但是通过魔术方法,可以调用了
$obj->runTest("para1","para2"); //没有声明这个runTest方法,因为有__call这个魔术方法,也可以被调用
MagicTest::runTest("para1","para2"); //没有声明这个runTest方法,因为有__callStatic这个魔术方法,也可以被调用

?>
登录后复制

Output:
Calling runTest with parameters: para1,para2
Static Calling runTest with parameters: para1,para2


__get(), __set(), __isset(), __unset()
在给不可访问属性赋值时,__set()会被调用
读取不可访问属性的值时,__get()会被调用
当对不可访问属性调用isset()或empty()时,__isset()会被调用
当对不可访问属性调用unset()时,__unset()会被调用
所谓不可访问属性,实际上就是在调用某个属性是发现这个属性没有被定义,这时候不同的操纵会触发不同的魔术方法
这几个方法也被称为属性重载的魔术方法


<?php class MagicTest{

	public function __tostring(){
		return "This is the Class MagicTest. ";
	}

	public function __invoke($x){
		echo "__invoke called with parameter ".$x."\n";
	}

	//方法的重载
	//这个方法的参数第一个就是调用的方法的名称,第二个参数是方法调用的参数组成的数组
	public function __call($name,$arguments){
		echo "Calling " . $name . "with parameters: ".
			implode(",", $arguments)."\n";

	}

	//<strong>静态方法的重载,注意这个方法需要设定为static
	public static function __callStatic($name,$arguments){
		echo "Static Calling " . $name . "with parameters: ".
			implode(",", $arguments)."\n";

	}

	//属性重载
	public function __get($name){
		return "Getting the property ".$name."\n";
	}

	public function __set($name, $value){
		echo "Setting the property ".$name." to value " . $value."\n";
	}

	public function __isset($name){
		echo "__isset invoked\n";
		return true;
	}

	public function __unset($name){
		echo "unsetting property ".$name."\n";
	}
}

$obj = new MagicTest();
echo $obj->className."\n"; //className未定义,但是通过魔术方法__get,这个方法好像被定义了一样
$obj->className='MagicClassX'; //通过魔术方法__get将className名称定义为MagicClassX
echo '$obj->name is set?'.isset($obj->className)."\n";
echo '$obj->name is empty?'.empty($obj->className)."\n";
unset($obj->className);
?>
登录后复制

Output:
Getting the property className
Setting the property className to value MagicClassX
__isset invoked
$obj->name is set?1 //如果return为true的话,结果显示为1;如果return为false的话,结果显示为空
__isset invoked
$obj->name is empty? //如果return为true的话,结果显示为空;如果return为false的话,结果显示为1
unsetting property className

面向对象--魔术方法
__clone()
PHP面向<strong>对象</strong>编程——特殊实践DAY 4

<?php class NbaPLayer{
	public $name;
	function __clone(){
		$this->name='TBD'; //屏蔽你不想要他复制过去的数据,屏蔽掉他的数据,设置他的初始值
	}
}

$james = new NbaPlayer();
$james->name = 'James';
echo $james->name."\n";
$james2 = clone $james;
echo "Before set up: James2's: ".$james2->name."\n";
$james2->name='James2';
echo "James's: ".$james->name;
echo "James's: ".$james2->name;

?>
登录后复制

output:
James
Before set up: James2's: TBD
James's: James
James's: James2 //James2的数据不会影响James的数据
-------------------------------------------------------------------------------PHP面向对象编程笔记就此完毕---------------------------------------------------------------------------------------

以上就介绍了PHP面向对象编程——特殊实践DAY 4,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

function是什么意思 function是什么意思 Aug 04, 2023 am 10:33 AM

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果,其目的是封装一段可重复使用的代码,提高代码的可重用性和可维护性。

iOS的developer版和public版有什么区别? iOS的developer版和public版有什么区别? Mar 01, 2024 pm 12:55 PM

每年Apple发布新的iOS和macOS大版本之前,用户都可以提前几个月下载测试版抢先体验一番。由于公众和开发人员都使用该软件,所以苹果公司为两者推出了developer和public版即开发者测试版的公共测试版。iOS的developer版和public版有什么区别呢?从字面上的意思来说,developer版是开发者测试版,public版是公共测试版。developer版和public版面向的对象不同。developer版是苹果公司给开发者测试使用的,需要苹果开发者帐号才可以收到下载并升级,是

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

MySQL.proc表的作用和功能详解 MySQL.proc表的作用和功能详解 Mar 16, 2024 am 09:03 AM

MySQL.proc表的作用和功能详解MySQL是一种流行的关系型数据库管理系统,开发者在使用MySQL时常常会涉及到存储过程(StoredProcedure)的创建和管理。而MySQL.proc表则是一个非常重要的系统表,它存储了数据库中所有的存储过程的相关信息,包括存储过程的名称、定义、参数等。在本文中,我们将详细解释MySQL.proc表的作用和功能

'enumerate()'函数在Python中的用途是什么? 'enumerate()'函数在Python中的用途是什么? Sep 01, 2023 am 11:29 AM

在本文中,我们将了解enumerate()函数以及Python中“enumerate()”函数的用途。什么是enumerate()函数?Python的enumerate()函数接受数据集合作为参数并返回一个枚举对象。枚举对象以键值对的形式返回。key是每个item对应的索引,value是items。语法enumerate(iterable,start)参数iterable-传入的数据集合可以作为枚举对象返回,称为iterablestart-顾名思义,枚举对象的起始索引由start定义。如果我们忽

Vue.use函数的用法和作用 Vue.use函数的用法和作用 Jul 24, 2023 pm 06:09 PM

Vue.use函数的用法和作用Vue是一款流行的前端框架,它提供了许多有用的功能和功能。其中之一就是Vue.use函数,它可以让我们在Vue应用中使用插件。本文将介绍Vue.use函数的用法和作用,并且提供一些代码示例。Vue.use函数的基本用法非常简单,只需在Vue实例化之前调用它,并传入要使用的插件作为参数。下面是一个简单的示例://引入并使用插件

在PHP中的file_exists()函数 在PHP中的file_exists()函数 Sep 14, 2023 am 08:29 AM

file_exists方法检查文件或目录是否存在。它接受要检查的文件或目录的路径作为参数。以下是它的用途-当您需要在处理之前知道文件是否存在时,它非常有用。这样,在创建新文件时使用此函数即可知道该文件是否已存在。语法file_exists($file_path)参数file_path-设置要检查是否存在的文件或目录的路径。必需。返回file_exists()方法返回。如果文件或目录存在,则返回TrueFalse,如果文件或目录不存在示例让我们看一个检查“candidate.txt”文件和即使文件

js函数function用法是什么 js函数function用法是什么 Oct 07, 2023 am 11:25 AM

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。

See all articles