<?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. Selenium中expected_conditions下text_to_be_present_in_element_value方法的使用

    text_to_be_present_in_element: 判断某个元素中的text是否包含了预期的字符串 text_to_be_present_in_element_value: 判断某个元素中的 ...

  2. ubuntu下安装nodejs

    前言 继前几天在wins环境下使用cygwin模拟器安装nodejs出现了一些问题后,今天我决定在ubuntu下安装nodejs,安装过程非常顺利,没有报错,看来还是linux环境给力啊,由于刚接触l ...

  3. Es使用。

    http://jingyan.baidu.com/article/3052f5a1e8a06397f31f8699.html --------------------------- http://el ...

  4. C#编程使用Managed Wifi API连接无线SSID

    C#编程使用Managed Wifi API连接无线SSIDhttp://www.2cto.com/kf/201307/227623.html Managed Wifi API - Homehttp: ...

  5. Windows启动系统程序命令

    DEVMGMT.MSC - Device Manager 设备管理器 DISKMGMT.MSC - Disk Management 磁盘管理   WindowsXP常用命令http://baike.b ...

  6. SharePoint文档库文件大小限制(win2008+II7)问题

    我们在用SharePoint存储文档时,用户要上传五十多MB到站点上,结果受到上传大小限制.在管理中心里做了修改,增加了上载大小限制.可是用户在上传的时候,提示复制一个或多个文件失败(win2003) ...

  7. hdu 4745 Two Rabbits

    思路:求最长回文子串的长度!代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #incl ...

  8. UITableViewController 滚动引起的cocos2d动画暂停问题的解决

    UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续 ...

  9. 安装MySQldb出错解决方法

    sudo yum install mysql-devel sudo yum install python-devel _mysql.c:36:23: error: my_config.h: No su ...

  10. 【查找结构4】红黑树 [RBT]

    红黑树的性质与定义 红黑树(red-black tree) 是一棵满足下述性质的二叉查找树: 1. 每一个结点要么是红色,要么是黑色. 2. 根结点是黑色的. 3. 所有叶子结点都是黑色的(实际上都是 ...