<?php

     //1. 类的声明(包括构造方法、析构方法)
class PersonA {
var $name; //成员属性,用var声明
public $age; //当有其他修饰的时候,就不要用var了
private $sex;
function eat(){ //成员方法
echo $this->name." eat now<br/>"; //使用this来引用类的成员属性
}
private function run(){ //带有权限修饰的成员方法
echo "run now<br/>";
} function __construct($name, $age = 23) { //构造方法,只能有一个,但可以通过默认参数实现类似于C++中的构造函数重载
$this->name = $name;
echo $name." 你好<br/>";
}
function __destruct() { //析构方法,PHP中已经有垃圾回收机制,析构方法在垃圾回收程序回收对象之前自动调用
echo $this->name." 再见<br/>";
}
} //2. 类的实例化
$person = new PersonA("张三");
$person->eat(); //3. 类的封装
/* private、public修饰符 基础的oop知识,不再赘述
* 主要介绍以下几个魔术方法
* __set(propertyName, propertyValue) 使用户可以直接给private变量赋值,赋值时会调用该方法
* __get(propertyName) 在获得private变量的值时调用
* __isset,__unset 对private变量调用iset和unset时使用
*/
class PersonB{
private $name;
private $sex;
public function __set($proName, $proValue){
if ($proName == "sex") {
if ($proValue != "男" && $proValue != "女") return;
}
echo "set $proName to $proValue <br/>";
$this->$proName = $proValue;
}
public function __get($proName) {
echo "get $proName value {$this->$proName} <br/> ";
return $this->sex;
}
public function __isset($proName) {
return isset($this->$proName);
}
public function __unset($proName) {
unset($this->$proName);
}
} $person = new PersonB();
var_dump(isset($person->sex));
$person->sex = "123";
$person->sex = "男";
var_dump(isset($person->sex));
echo $person->sex."<br/>";
unset($person->sex);
var_dump(isset($person->sex));
echo "<br/><br/>"; //4. 类的继承
/* PHP中采用的是和JAVA一样的单继承,使用extends关键字
* protected修饰的成员可以在子类中访问
* 支持重写,但子类中的方法开放程度要高于父类
* 使用parent::fun()可以调用父类中的方法;
*/
class PersonAson extends PersonA {
function eat() {
parent::eat();
echo "son eat now<br/>";
}
}
$person = new PersonAson("李四");
$person->eat();
unset($person); //也可以显示调用
echo "<br/><br/>"; //5. 常见的关键字和魔术方法
/* 常用关键字
* final final修饰的类不能被继承,final修饰的方法不能被重写,注意final不能用来修饰变量
* static 标志类属性和类方法,为所有类共有,使用(类名::方法名)来访问,在类自身也可以用(self::方法名)来访问
* const 定义类常量,通常变量名都是大写,而且使用时不需要$操作符
* instanceof 确定一个对象是类的实例
* clone 使用clone拷贝一个对象
* 常用魔术方法
* __toString() 获取对象字符串表示,输出对象引用时会调用此方法
* __call() 调用类中不存在的方法会调用该防范,第一个参数为函数名,第二个参数为函数列表.有独特的作用.
* __autoload() 在用一个该文件中没有的类的时候,会自动调用该方法,可以在该方法中include类文件等操作
* serialize 对象串行化,以在网络中传输或者保存在文件中.
* unserialize 对象反串行化
*/
$person = new PersonA("王五");
$personclone = clone $person;
$personclone->eat();
var_dump($personclone instanceof PersonA);
unset($person);
unset($personclone);
echo "<br/>"; class PersonC {
private $name;
private $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function __toString() {
return "name: ".$this->name." age: ".$this->age."<br/>";
}
public function __call($method, $args) { //连贯操作,这里来给变量赋值,在SQL中可能会常用
if ($method == "name")
$this->name = $args[0];
else if ($method == "age")
$this->age = $args[0]; return $this;
}
}
$person = new PersonC("zhangsan", 15);
echo $person; //这时候其实会调用toString方法
echo $person->name("lisi")->age(20); //巧妙使用__call方法 $person_string = serialize($person);
echo $person_string."<br/>"; $person = unserialize($person_string);
echo $person;
echo "<br/>"; //6. 抽象类与接口
/* abstract class 修饰抽象类,不能被实例化,里面的成员不能是private的.里面可以有抽象方法,用abstract修饰,没有任何实现.
* 子类必须实现所有父类的抽象方法才能实例化,否则也是抽象类.
* interface 所有方法都是抽象方法,只能有const常量,所有成员都必须是public的,子类使用implements实现接口.
* 接口可以实现多个
* 写法和JAVA基本一致,不再赘述.
*/ //7. 简单多态的应用,一个简单的USB接口程序
interface USB {
function run();
}
class UKey implements USB {
public function run() {
echo "Ukey run<br/>";
}
}
class UMouse implements USB {
public function run() {
echo "UMouse run<br/>";
}
}
class Computer {
function useUSB($usb) {
$usb->run();
}
}
$com = new Computer();
$com->useUSB(new UKey());
$com->useUSB(new UMouse());
?>

执行结果

张三 你好
张三 eat now
张三 再见
bool(false) set sex to 男
bool(true) get sex value 男

bool(false) 李四 你好
李四 eat now
son eat now
李四 再见 王五 你好
王五 eat now
bool(true) 王五 再见
王五 再见 name: zhangsan age: 15
name: lisi age: 20
O:7:"PersonC":2:{s:13:"PersonCname";s:4:"lisi";s:12:"PersonCage";i:20;}
name: lisi age: 20 Ukey run
UMouse run

PHP学习笔记05——面向对象的更多相关文章

  1. JavaSE学习笔记05面向对象编程01

    面向对象编程01 java的核心思想就是OOP 面向过程&面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么...... 面向过程适合处理一些较为简单的问题 面向对象思想: 物 ...

  2. UML和模式应用学习笔记-1(面向对象分析和设计)

    UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归

    机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...

  4. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  5. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  6. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

  7. C++ GUI Qt4学习笔记05

    C++ GUI Qt4学习笔记05   qtc++正则表达式 QIntValidator           --  只让用户输入整数 QDoubleValidator     --  只让用户输入浮 ...

  8. 我的Java学习笔记-Java面向对象

    今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...

  9. [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明

    作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...

随机推荐

  1. VC中Source Files, Header Files, Resource Files,External Dependencies的区别

    VC中Source Files, Header Files, Resource Files,External Dependencies的区别 区别: Source Files 放源文件(.c..cpp ...

  2. Visual Studio 常用快捷键 (二)

    想不到上一篇 [Visual Studio 常用快捷键] 受这么多人的欢迎.看来大家对Visual Studio的用法非常感兴趣. 接下来我准备写一个 “Visual Studio使用技巧 ” 一个系 ...

  3. linux下关于gz和bz2压缩格式的常用操作技巧

    .gz和.bz2都是linux下压缩文件的格式,有点类似windows下的.zip和.rar文件..bz2和.gz的区别在于,前者比后者压缩率更高,后者比前者花费更少的时间. 也就是说同一个文件,压缩 ...

  4. http://blog.csdn.net/woshiyjk/article/details/7895888

    http://blog.csdn.net/woshiyjk/article/details/7895888

  5. hadoop jobhistory解析工具汇总

    1. White Elephant是LinkedIn开源的一套Hadoop 作业日志收集器和展示器,使用mapreduce作业解析jobhistory日志,得到每个用户使用的资源情况,并通过网页展示. ...

  6. scp 传文件

    1. 从远程服务器上拷贝文件(指定远程服务器的用户名:IP:文件    本地文件名) scp root@121.43.16.131:/etc/supervisor/supervisord.conf ~ ...

  7. Centos环境下部署游戏服务器-软件安装

    这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...

  8. 修改图层的symbol(AE+C#)

    取出一个图层的symbol 在其基础上对其进行修改 private void button1_Click(object sender, EventArgs e)        {  mp;nbsp;  ...

  9. 使用Intellij IDEA从零使用Spring MVC

    原文:使用Intellij IDEA从零使用Spring MVC 使用Intellij IDEA从零使用Spring MVC 黑了Java这么多年, 今天为Java写一篇文章吧. 这篇文章主要是想帮助 ...

  10. iOS Core Telephony Framework

    Core Telephony Framework(核心通讯框架) 概述: 这个库的前缀为CT(Core Telephony),主要用来获得用户通讯相关信息,我们可以使用这些信息来定义外部接口以便自己使 ...