当前位置: 首页 > 编程日记 > 正文

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 . "\n";}
}// Animal类实现了ICanEat接口
class Animal implements ICanEat {public function eat($food){echo "Animal eating " . $food . "\n";}
}function eat($obj){if($obj instanceof ICanEat){ $obj->eat("FOOD"); // 不需要知道到底是Human还是Animal,直接吃就行了}else{echo "Can't eat!\n";}
}$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.\n";}
}// Human类实现了ICanEat接口
class Human extends ACanEat { // 跟Animal类的实现是不同的public function eat($food){echo "Human eating " . $food . "\n";}
}// Animal类实现了ICanEat接口
class Animal extends ACanEat {public function eat($food){echo "Animal eating " . $food . "\n";}
}$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.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}
}$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.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}
}$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.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}// 通过这两个方法可以实现动态的对象属性public function __get($name){return "Getting the property " . $name;}public function __set($name, $value){echo "Setting the property " . $name . " to value ". $value. "\n";}public function __isset($name){echo "__isset invoked\n";return false;}public function __unset($name){echo "unsetting property " . $name;}
}$obj =  new MagicTest();
echo $obj->name . "\n";
$obj->name = "Name Value";
echo '$obj->name is set? '. isset($obj->name) . "\n";
echo '$obj->name is empty?' . empty($obj->name) . "\n";
unset($obj->name);
?>

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

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

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

相关文章:

云解析DNS产品优势与应用场景

什么是阿里云解析&#xff1a;阿里云解析是面向全网域名开放的域名智能解析服务。阿里云解析做为云计算服务的入口&#xff0c;将逐步与阿里云已有云产品融合打通&#xff0c;成为云产品大家庭中不可或缺的一份子。ECS、RDS、CDN、SLB 等产品为用户提供高效可靠的计算、存储、网…

字节跳动 录屏功能_一周盘点:Instagram打通视频购物功能 公开叫板TikTok;字节跳动要大力布局跨境出口电商?...

周末刚结束&#xff0c;预祝各位小伙伴们在接下来的每一天都能大卖&#xff01;大师兄先带你盘点这一周都有哪一些跨境电商热点事件&#xff1a;每周要点Instagram打通视频购物功能 公开叫板TikTok据外媒报道&#xff0c;Instagram于美国当地时间12月10日宣布&#xff0c;将把应…

postgresql scws zhparser安装

2019独角兽企业重金招聘Python工程师标准>>> 基于postgresql9.6 scws 1.23 postgresql9.6安装参看本博客相关教程 zhparser安装 1、export PATH"$PATH:/usr/pgsql-9.6/bin" 2、SCWS_HOME/usr/local make && make install 转载于:https://my.oschi…

Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法

原文地址:http://www.cnblogs.com/hoojo/p/Spring_Hibernate_MyBatis_MultipleDataSource_switchDataSource.html#2836713 转载于:https://www.cnblogs.com/longshiyVip/p/5024040.html

graphpad做折线图后怎么保存_农村的干豆角怎么做的?农村妹子教你两个窍门,保存2年都不会坏...

农村经常制作的干豆角怎么做的&#xff1f;农村妹子教你两个窍门&#xff0c;保存到冬天炖肉吃夏季&#xff0c;这个时节正是豆角生长最旺盛的时候&#xff0c;在农村&#xff0c;只要种一小块地的豆角&#xff0c;都是吃不完的&#xff0c;如果不摘下来&#xff0c;就只能看着…

PCL—低层次视觉—点云分割(基于凹凸性)

1.图像分割的两条思路 场景分割时机器视觉中的重要任务&#xff0c;尤其对家庭机器人而言&#xff0c;优秀的场景分割算法是实现复杂功能的基础。但是大家搞了几十年也还没搞定——不是我说的&#xff0c;是接下来要介绍的这篇论文说的。图像分割的搞法大概有两种&#xff1a;剑…

wireshark-wincap安装问题

winpcap关键模块 32位系统&#xff1a; C:\Windows\system32\wpcap.dll C:\Windows\system32\Packet.dll C:\Windows\system32\WanPacket.dll C:\Windows\system32\pthreadVC.dll C:\Windows\system32\drivers\npf.sys 64位系统&#xff1a; C:\Windows\SysWOW64\wpcap.dll C:\…

liunx学习笔记(一:常用命令)

linux:在学习linux之前我们应该多少了解windows的一些相关操作&#xff0c;linux也就是类似windows的另一种操作系统&#xff0c;用来管理软硬件的一种应用。在windows下你可以通过鼠标点击相关的图标进行对应的操作&#xff0c;而在Linux中却是需要使用者输入一行行的命令&…

aspose.cells 无法读取公式值_隐藏 Excel表格、公式的9种方法

Excel&#xff0c;站在你面前&#xff0c;你却看不见.....1、给Excel文件穿上隐身衣在win10系统中&#xff0c;隐藏文件变得如此容易&#xff0c;选取文件点“隐藏所选项目”&#xff0c;再去掉“隐藏的项目”勾选 "&#xff08;想彻底隐藏需要修改注册表&#xff0c;新手…

12-09关于几种排序方式

一.选择排序 #include <stdio.h> //选择排序 //记录最小的那个数的索引值 //下面这个循环就是去寻找最小的那个数的index //有比k对应的值更小的 //判断是否需要交换 //k和i对应的值交换 void selectsort(int array[],int counttimes){ int k 0; for (int i 0; i < …

Redis事务介绍

概述 相信学过Mysql等其他数据库的同学对事务这个词都不陌生&#xff0c;事务表示的是一组动作&#xff0c;这组动作要么全部执行&#xff0c;要么全部不执行。为什么会有这样的需求呢&#xff1f;看看下面的场景&#xff1a; 微博是一个弱关系型社交网络&#xff0c;用户之间有…

那些按烂的Linux命令集合贴

#查看80端口运行情况netstat -anp|grep 80 #关闭某个进程(如8848pid) kill -9 8848 #运行java的war包 java -jar myproj.war #持续后台运行java项目 nohup java -jar myproj.war > log.file 2>&1 & #重启计算机(服务器)不推荐使用,并不是平滑地关闭程序应用,推荐…

colsure php_PHP Closure(闭包)类详解

闭包就是能够读取其他函数内部变量的函数。例如在javascript中&#xff0c;只有函数内部的子函数才能读取局部变量&#xff0c;所以闭包可以理解成“定义在一个函数内部的函数“。在本质上&#xff0c;闭包是将函数内部和函数外部连接起来的桥梁。 在php中,闭包函数一般就是匿名…

yjk只算弹性的不计算弹塑性_基于ANSYS Workbench的表面裂纹计算

一、写在前面本教程使用ANSYS Workbench17.0 进行试件表面裂纹的分析&#xff0c;求应力强度因子。需要提前说明的是&#xff0c;本案例没有工程背景&#xff0c;仅为说明裂纹相的计算方法&#xff0c;因此参数取值比较随意&#xff0c;大量设置都采用了默认值。对于实际工程&a…

《需求分析与系统设计》读书笔记1

这个月开始对《需求分析与系统设计》的阅读&#xff0c;在读这本书之前我先看了看网上对这本书的书评&#xff0c;了解到这本书论述了需求分析和系统设计的迭代增量式过程&#xff0c;并讨论了软件生命周期的其他阶段&#xff08;包括实现、测试和变化管理&#xff09;。本书提…

两个主键怎么设置tsql_索引该怎么创建?

1.2、索引 BTree 结构的特性&#xff1a;①、BTree 只有叶子节点会存储真实的数据&#xff0c;非叶子节点只会存储索引字段值&#xff1b;②、BTree的叶子节点之间使用 双向链表 链接&#xff0c;所以更加适合范围查询和排序&#xff1b;2、索引的类型&#xff1a;在平时创建的…

数据库连接池,实现及分析

在我们日常对数据库操作时存在一个问题&#xff0c;要为每次数据操作请求建立一个数据库连接。而每次建立连接都需要花费很多开销&#xff0c;如加载驱动类、注册驱动、获取连接&#xff0c;这样如果在短时间内连接多次&#xff0c;就 会耗费多余的时间(加载驱动注册驱动)*n次&…

BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案排序离散化然后树状数组维护.操作数为M的话时间复杂度大概是O(M(logM)^2)-----------------------------------------------------------------------#include…

iOS开发之绝对布局和相对布局(屏幕适配)

在IOS的UI设计中也有绝对定位和相对定位&#xff0c;和我们的web前端的绝对定位和相对定位有所不同但又有相似之处。下面会结合两个小demo来学习一下我们IOS开发中UI的绝对定位和相对定位。在前面的博客中所用到的UI事例用的全是绝对定位&#xff0c;用我们Storyboard拖拽出来的…

设计模式5-抽象工厂模式

package DesignPattern;public class AbstractFactory {public static class Dough{}public static class Sauce{}public static class Veggies{}public static class Cheese{}public static class Pepperoni{}public static class Clams{}//披萨public static abstract class …

wp打印输出日志

System.Diagnostics.Debug.WriteLine(String); 转载于:https://www.cnblogs.com/songtzu/archive/2012/07/26/2609678.html

Element-ui表格选中回显

先瞄一下&#xff0c;是不是你要的效果 然后&#xff0c;废话不多说&#xff0c;直接上代码啦 1 <template>2 <div class>3 <div class"projectData">4 <el-table :data"tableData2" ref"multipleTable" :show…

iOS开发者帐号申请指南

如果你是一个开发团队&#xff0c;在你打算掏腰包购买iOS开发者授权之前&#xff0c;最好先问一下你的同事&#xff0c;是否已经有人获得了开发许可&#xff0c;因为一个开发许可一年内最多可以授权给111个设备来开发测试。如果你没有授权许可可以借用&#xff0c;或者你打算最…

Redis的KEYS命令引起宕机事件

摘要&#xff1a; 使用 Redis 的开发者必看&#xff0c;吸取教训啊&#xff01; 原文&#xff1a;Redis 的 KEYS 命令引起 RDS 数据库雪崩&#xff0c;RDS 发生两次宕机&#xff0c;造成几百万的资金损失作者&#xff1a;陈浩翔Fundebug经授权转载&#xff0c;版权归原作者所有…

GridView的编辑,更新,取消,删除等功能演示

GridView的编辑,更新,取消,删除等功能演示 这是一个GridView应用的视频&#xff0c;内容很透彻的讲解了GridView的很多实用的技巧。 下载地址&#xff1a;http://download.cnblogs.com/insus/ASPDOTNET/GridViewEditUpdateCancelDelete.rar posted on 2015-12-15 09:20 代码养家…

mac 使用homebrew 安装mysql

1. 安装homebrew ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" brew update 2.安装mysql brew install mysql 3.设置 MySQL 用户以及数据存放地址&#xff0c;下载的mysql的mysql_install_db文件中的路径有错误 需要重新设置一下文件路径&…

触控(Touch) 、 布局(Layout)

1 使用触控实现一个简易的画板 1.1 问题 触控&#xff08;Touch&#xff09;是一个UITouch类型的对象&#xff0c;当用户触摸了屏幕上的视图时自动被创建&#xff0c;通常使用触控实现绘图、涂鸦、手写等功能。本案例使用触控实现一个简易的画板&#xff0c;可以在画板上勾画出…

fail-fast和fail-safe的介绍和区别

2019独角兽企业重金招聘Python工程师标准>>> fail-fast和fail-safe 前言 前段时间公司招的实习生在使用迭代器遍历的时候,对集合内容进行了修改,从而抛出ConcurrentModificationException. 然后给他讲解之余也整理了这一篇文章. fail-fast ( 快速失败 ) 在使用迭代器…

hdu 4311 Meeting point-1

http://acm.hdu.edu.cn/showproblem.php?pid4311 思维呀 亲 你想到就可以做出来 想不到就做不出了 什么都不说了 上代码 不知道为什么 在hdu 上 long long 和 int 相乘就让我错 #include<iostream> #include<cstdio> #include<algorithm> #include<c…

Spring Boot 整合Pagehelper(为什么PageHelper分页不生效)

引入包https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter/1.2.10 <!--分页--><!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --><dependency><groupId>com…