首页 > PHP面向对象编程(imooc)代码合集(四)

PHP面向对象编程(imooc)代码合集(四)

class10 多态

多态简单说就是用不同的类去实现同一个接口的方法,以实现不同类自己的方法

php
date_default_timezone_set("PRC");
/*** 多态* 1. 只要某个对象实现了接口(instanceof),就可以直接在对象上调用接口的方法*/interface ICanEat {public function eat($food);
}// Human类实现了ICanEat接口
class Human implements ICanEat { // 跟Animal类的实现是不同的public function eat($food){echo "Human eating " . $food . "
";}
}// Animal类实现了ICanEat接口
class Animal implements ICanEat {public function eat($food){echo "Animal eating " . $food . "
";}
}function eat($obj){if($obj instanceof ICanEat){ $obj->eat("FOOD"); // 不需要知道到底是Human还是Animal,直接吃就行了}else{echo "Can't eat!
";}
}$man = new Human();
$monkey = new Animal();// 同样的代码,传入接口的不同实现类的时候,表现不同。这就是为什么成为多态的原因。
eat($man);
eat($monkey);?>

 

class11  抽象类

抽象类是介于接口和一般类之间的一个类,它允许自身的某些方法暂时没有具体实现;但是,抽象类和接口一样,不能直接实例化为对象,必须要一个一般类去继承它,它只能作为父类被使用

php
date_default_timezone_set("PRC");
/*** 抽象类* 1. 抽象类允许类里面的部分方法暂时没有具体实现,这些方法我们成为抽象方法* 2. 一旦类里面有抽象方法,这个类就必须是抽象类* 3. 抽象类跟接口一样,不能直接实例化为对象*/// 抽象类前面以abstract关键字开始
abstract class ACanEat {// 没有实现的方法需要设定为抽象方法// 抽象方法需要在子类中实现 abstract public function eat($food);public function breath(){echo "Breath use the air.
";}
}// Human类实现了ICanEat接口
class Human extends ACanEat { // 跟Animal类的实现是不同的public function eat($food){echo "Human eating " . $food . "
";}
}// Animal类实现了ICanEat接口
class Animal extends ACanEat {public function eat($food){echo "Animal eating " . $food . "
";}
}$man = new Human();
$man->eat("Apple");
$man->breath(); // 和Animal共用了抽象类ICanEat的breath方法
$monkey = new Animal();
$monkey->eat("Banana");
$monkey->breath();?>

 

 

这只后给大家简单介绍一下PHP中特有的一些方法(PHP特性),他们分别是

 __tostring()--能使对象当做String直接调用
__invoke()   --能使对象被当成方法被自动调用

 

class12 

 __tostring()--能使对象当做String直接调用
__invoke()   --能使对象被当成方法被自动调用
php
date_default_timezone_set("PRC");
/*** 魔术方法1* 1. 当对象被当做String使用时,__tostring()会被自动调用* 2. 当对象被当成方法调用时,__invoke()会被自动调用*/
class MagicTest{public function __tostring(){return "This is the Class MagicTest.
";}public function __invoke($x){echo "__invoke called with parameter " . $x . "
";}
}$obj =  new MagicTest();
echo $obj;
$obj(5);  //直接在对象中传入参数5,它会被__invoke()函数接收?>

 

class13  

  1. 当对象访问不存在的方法名称时,__call()方法会被自动调用2. 当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用





php
date_default_timezone_set("PRC");
/*** 魔术方法2之方法重载* 1. 当对象访问不存在的方法名称时,__call()方法会被自动调用* 2. 当对象访问不存在的静态方法名称时,__callStatic()方法会被自动调用*/
class MagicTest{public function __tostring(){return "This is the Class MagicTest.
";}public function __invoke($x){echo "__invoke called with parameter " . $x . "
";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "
";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "
";}
}$obj =  new MagicTest();
$obj->runTest("para1", "para2");
MagicTest::runTest("para3","para4");?>

 

class14

__set()
__get()
isset()
empty()
unset()
__unset()
php
date_default_timezone_set("PRC");
/*** 魔术方法3之属性重载* 1. 在给不可访问属性赋值时,__set() 会被调用。* 2. 读取不可访问属性的值时,__get() 会被调用。* 3. 当对不可访问属性调用 isset() 和empty()时,__isset() 会被调用。* 4. 当对不可访问属性调用 unset() 时,__unset() 会被调用*/
class MagicTest{public function __tostring(){return "This is the Class MagicTest.
";}public function __invoke($x){echo "__invoke called with parameter " . $x . "
";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "
";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "
";}// 通过这两个方法可以实现动态的对象属性public function __get($name){return "Getting the property " . $name;}public function __set($name, $value){echo "Setting the property " . $name . " to value ". $value. "
";}public function __isset($name){echo "__isset invoked
";return false;}public function __unset($name){echo "unsetting property " . $name;}
}$obj =  new MagicTest();
echo $obj->name . "
";
$obj->name = "Name Value";
echo '$obj->name is set? '. isset($obj->name) . "
";
echo '$obj->name is empty?' . empty($obj->name) . "
";
unset($obj->name);
?>

 

 

后边几个魔术方法,具体在什么时候调用呢?

我觉得是用于容错处理的。

转载于:https://www.cnblogs.com/construtora/p/5021302.html

更多相关:

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...

  •   /*禁止缩放safari浏览器*/ var scale = {disabledSafari: function () {/* 阻止双击放大*/var lastTouchEnd = 0;document.addEventListener("touchstart", function (event) {if (event.touch...

  •   $g.$utils = {/**舒工Ajax-lite 1.0 -- 最精简的ajax自定义访问方法*/ajax: function (o) {var p = o.post, g = o.get, d = p.data, a = p.async, J = 'json', j = p[J], s = g.success, e =...

  •   Sg.js框架核心概念: 1)所有变量、方法、类对象全部都是从属于$g主树,由$g分支出很多$g.变量名、$g.方法、$g.对象id、$g.类;2)获取控件内部属性必须使用公开的get方法获取,禁止直接用访问内部变量方式来获取控件内部变量、属性值;3)修改控件内部属性、绑定方法等都必须使用公开的set方法来操作,禁止直接用访问...

  •  一、ios header导航栏被推起解决方法 1 设置弹出软键盘时自动改变webview的高度 plus.webview.currentWebview().setStyle({ softinputMode: "adjustResize" // 弹出软键盘时自动改变webview的高度 }); 2 增加样式 html...

  • 前端发送Ajax请求到服务器,服务器返回数据这一过程,因原因不同耗时长短也有差别,且这段时间内页面显示空白。如何优化这段时间内的交互体验,以及长时间内服务器仍未返回数据这一问题,是我们开发中不容忽视的重点。 常见的做法是: 1、设置超时时间,一旦时间超过设定值,便终止请求;2、页面内容加载之前,手动增加一个 loading 层。 代码...

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 这是第三部分,完成效果如下 图1 建图和导航 三、使用RTAB-Map进行建图和导航 1. rtab...

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 由于之前的虚拟机性能限制,我在这个项目中使用了新的ubantu 16.04环境,虚拟机配置 内存 8GCPU...

  • [{name:1},{name:2}].forEach((v,i,ar) => {console.log(v,i,ar)});//基础遍历[{name:1},{name:2}].map((v) => v.name);//[1,2]返回对象数组中指定字段值的一位数组(不改变原始数组)[{name:1},{name:2},{name:3}...

  • 体验内容 使用gmapping方法利用turtlebot底盘移动信息和激光雷达数据进行建图。 1. 安装一些依赖包 sudo apt-get install ros-melodic-move-base* sudo apt-get install ros-melodic-map-server* sudo apt-get insta...

  • 前言 我们知道Java/Python这种语言能够很好得 支持反射。反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 从而做出对应的操作。 而C++ 并没有友好得支持这样的操作,而最近工作中需要通过C++实现http接口,这个过程想要代码实现得优雅...