荒芜的周六-PHP之面向对象(三)
hi
又是开森的周六了。积攒的两周的衣服,终于是差不多洗完了。大下午的才来学点东西~~
1、PHP面向对象(三)
四、OOP的高级实践
4.3 Static-静态成员
<?php
date_default_timezone_set("PRC");
/**
* 1. 类的定义以class关键字开始,后面跟着这个类的名称。类的名称命名通常每个单词的第一个字母大写。
* 2. 定义类的属性
* 3. 定义类的方法
* 4. 实例化类的对象
* 5. 使用对象的属性和方法
*/
class Human{
public $name;
public $height;
public $weight;
public function eat($food){
echo $this->name."'s eating ".$food."<br/>";
}
}
class Animal{
public $kind;
public $gender;
}
class NbaPlayer extends Human{
// 类的属性的定义
public $name="Jordan";// 定义属性
public $height="198cm";
public $weight="98kg";
public $team="Bull";
public $playerNumber="23";
private $age="44";
public $president="David Stern";
// 类的方法的定义
public function changePresident($newP){
$this->president=$newP;
}
public function run() {
echo "Running<br/>";
}
public function jump(){
echo "Jumping<br/>";
}
public function dribble(){
echo "Dribbling<br/>";
}
public function shoot(){
echo "Shooting<br/>";
}
public function dunk(){
echo "Dunking<br/>";
}
public function pass(){
echo "Passing<br/>";
}
public function getAge(){
echo $this->name."'s age is ".$this->age;
}
function __construct($name, $height, $weight, $team, $playerNumber){
print $name . ";" . $height . ";" . $weight . ";" . $team . ";" . $playerNumber."\n";
$this->name = $name; // $this是php里面的伪变量,表示对象自身
$this->height = $height; // 通过$this可以设置对象的属性值
$this->weight = $weight;
$this->team = $team;
$this->playerNumber = $playerNumber;
}
}
/**
* 1. 类实例化为对象时使用new关键字,new之后紧跟类的名称和一对括号。
* 2. 使用对象可以像使用其他值一样进行赋值操作
*/
$jordan = new NbaPlayer("Jordan", "198cm","98kg","Bull","23");echo "<br/>";
$james=new NbaPlayer("James", "203cm", "120kg", "Heat", "6");echo "<br/>";
// 访问对象的属性使用的语法是->符号,后面跟着属性的名称
echo $jordan->name."<br/>";
// 调用对象的某个方法使用的语法是->符号,后面跟着方法的名称和一对括号
$jordan->run();
$jordan->pass();
//子类调用父类的方法
$jordan->eat("apple");
//试着调用private,直接以及通过内部的public函数
//$jordan->age;
$jordan->getAge();echo "<br/>";
$jordan->changePresident("Adam Silver");
echo $jordan->president."<br/>";
echo $james->president."<br/>";
直接从上述例子开始吧。
这里想得到的是,把两位对象的某一个变量同时变掉。——用static
public static $president="David Stern";
// 类的方法的定义
public static function changePresident($newP){
static::$president=$newP;//这里static换成self更符合规范
}
注意这里static的位置,以及,方法内的::
调用的方法也有所变动。
echo NbaPlayer::$president;echo "<br/>";
NbaPlayer::changePresident("Adam Silver");
echo NbaPlayer::$president;echo "<br/>";
也就是像之前说的,静态成员就是个常量,所以不针对某个具体的对象(不受具体对象的约束)——基于此,定义&赋值&调用都不需要具体的对象参与。
内部调用要用self/static::$...
外部调用,类名::
用处就是所有的对象共用的数据。
--如果内部调用时,变量在父类中
比如说,在上述例子中,父类human中写这么一句话
public static $aaa="dafdfa";
然后在子类nbaplayer中,调用父类的静态成员时,要
echo parent::$aaa;
而外部调用,按照上面说的,类名::,所以,直接父类类名即可
echo Human::$aaa;
--其他
在静态方法中,是无法访问其他变量的,也就是说,不能用$this->
--小结
/**
* 静态成员
* 1. 静态属性用于保存类的公有数据
* 2. 静态方法里面只能访问静态属性
* 3. 静态成员不需要实例化对象就可以访问
* 4. 类内部,可以通过self或者static关键字访问自身的静态成员
* 5. 可以通过parent关键字访问父类的静态成员
* 6. 可以通过类名称在外部访问类的静态成员
*/
4.4 Final成员
--问题
不希望某个类拥有子类;
不希望子类修改父类中的某个变量(避免重写?)
--final
》=php5版本
举个例子
class BaseClass{
public function test(){
echo "BaseClass::test called<br/>";
}
public function test1(){
echo "BaseClass::test1 called<br/>";
}
}
class ChildClass extends BaseClass{
public function test(){
echo "ChildClass::test called<br/>";
}
}
$obj=new ChildClass();
$obj->test();
子类中编写跟父类中完全一致的方法名(内容可以不同),会完成对父类方法的重写!
所以,不希望被重写的父类中的方法,写上final
final public function test(){
依此类推,对于不想有子类的父类,在类名那里写上final
final class BaseClass{
--小结
/**
* 重写和Final
* 1. 子类中编写跟父类完全一致的方法可以完成对父类方法的重写
* 2. 对于不想被任何类继承的类可以在class之前添加final关键字
* 3. 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字
*/
4.5 数据访问
先把final都去掉
--parent
然后再子类中的方法中写
parent::test();
运行后会发现,依然可以通过parent的关键字调用父类中,即使是被重写的数据
--self
然后在父类中的方法test中写
self::test1();
运行后,发现self可以调用同一个类中的数据(其他方法/静态变量/常量const)
--小结
/**
* 数据访问补充
* 1. parent关键字可以用于调用父类被重写的类成员
* 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号
* 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
*/
4.6 对象接口
非常重要!!!
--问题
不同的类,有着相同的行为,但相同的行为又有着不同的实现方法。
比如人和动物都会吃东西,但吃的方式方法又不太一样。
--定义
接口就是把不同类的共同行为进行了定义,然后在不同的类里面实现不同的功能。
--栗子
//定义一个接口
interface ICanEat{
public function eat($food);
}
可以看到,接口中并没有方法的具体实现,但必须有方法!
那么,下面是,“人类会吃”
//具体对象,连接到接口
class Human implements ICanEat{
public function eat($food){
echo "Human eating ".$food.".<br/>";
}
}
$obj=new Human();
$obj->eat("shit");
请忽略我给出的“食物”。
注意,不再用extends,而是implements。然后,同样是方法名的完全相同。然后,对象必须/最好实现方法。
继续
interface ICanEat{
public function eat($food);
}
//具体对象,连接到接口
class Human implements ICanEat{
public function eat($food){
echo "Human eating ".$food.".<br/>";
}
}
class Animal implements ICanEat{
public function eat($food){
echo "Animal eating ".$food.".<br/>";
}
}
$obj=new Human();
$obj->eat("shit");
$monkey=new Animal();
$monkey->eat("banana");
让动物也吃起来!
--逆向操作
判断某个对象是否连接了某个接口。
var_dump($obj instanceof ICanEat);
会返回boolean值。
--更多的栗子
interface ICanPee extends ICanEat{
public function pee();
}
class Demon implements ICanPee{
public function pee(){
echo "Can demon pee?";
}
public function eat($food){
echo "Can demon eat ".$food;
}
}
$ghost=new Demon();
$ghost->pee();
$ghost->eat("shit");
接口本质上也是类,可以被继承/继承,但是使用继承接口的接口,所有父类、“爷类”的方法都要有具体实现。
--小结
/**
* 接口
* 1. 接口的基本概念和基本使用方法
* 2. 接口里面的方法没有具体的实现
* 3. 实现了某个接口的类必须提供接口中定义的方法
* 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口
* 5. 接口可以继承接口(interface extends interface)
* 6. 接口中定义的所有方法都必须是公有,这是接口的特性。
*/
aaaaaaaaaaaaaa
bu xiang xie le....................
ming tian yao ge ..............
荒芜的周六-PHP之面向对象(三)的更多相关文章
- Python面向对象三要素-继承(Inheritance)
Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- JavaScript 面向对象(三) —— 高级篇
JavaScript 面向对象(一) —— 基础篇 JavaScript 面向对象(二) —— 案例篇 一.json方式的面向对象 首先要知道,js中出现的东西都能够放到json中.关于json数据格 ...
- JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
前 言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...
- Python之面向对象三
面向对象的三大特性: 多态 多态指的是一类事物有多种形态.Python3天生支持多态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCM ...
- Python面向对象(三)
一.绑定方法与非绑定方法 一.绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的 2.绑定给类的方法:为类中定义的函数加上 ...
- Python面向对象三要素-多态
Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...
- javascript面向对象(三):非构造函数的继承
本文来自阮一峰 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使用构造函数实现"继承" ...
- Objective-C面向对象(三)
1.类的继承 OC的继承是单继承,每个子类只有一个直接父类 1.1 继承的特点 OC继承的语法 @interface SubClass :SuperClass { //成员变量定义 } //方法定义部 ...
随机推荐
- Sortable – 简单灵活的 JavaScript 拖放排序插件
当需要在网站中添加拖放排序功能的时候,jQuery UI 的排序组件可能是最流行的解决方案.今天给大家介绍另一款简单灵活的 JavaScript 拖放排序插件——Sortable,它使用 HTML5 ...
- Reapp - 下一代的 Hybrid App 开发框架
Reapp 与 React Native 有着惊人的相似之处,二者都使用 React 来创建应用程序用户界面的框架.然而,在底层机制上这两个框架之间却具有明显的哲学差异.React Native 将 ...
- 如何垂直居中div?面试经常问到
水平居中:给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto;} 让绝对定位的div居中 ;;;;} 重点来了! 水平垂直居中 ...
- jquery取消事件冒泡的三种方法(推荐)
1.通过返回false来取消默认的行为并阻止事件起泡. jQuery 代码: ? 1 2 3 4 5 6 7 8 9 10 11 $("form").bind( "s ...
- ALV中处理过滤掉的行
有时候我们在ALV的时候,客户会对输出的数据进行二次筛选,这时候如果我们做全选(checkbox)系统会把我们过滤掉得数据也选择: 用下面的method就可避免此问题: DATA:it_rows TY ...
- ABAP中的数据校验-备注
通过 function module 检查日期是否合法(DDUT_INPUT_CHECK的校验会根据账户的时间设置格式) 日期校验方式一: CALL FUNCTION ‘DATE_CHECK_ ...
- AdaBoost
一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单"听取多人意见,最后综合决策",但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下午,邹博在我组织的机器学 ...
- JDBC连接MySQL 方法 实例及资料收集
JDBC连接MySQL 方法 实例及资料收集 准备工作 首先,安装MySQL,配置用户名和密码,创建数据库. 可参见之前的文章: http://www.cnblogs.com/mengdd/p/315 ...
- .frame类库简单介绍与使用
.a静态库是Unix推出的,几乎所有平台都可以使用: .framework是Apple推出的,是对.a静态库的封装,方便使用. 1.新建framework类库项目 2.生成的类库中,自定义的源头文件需 ...
- Android 手机卫士--九宫格使用
本文地址:http://www.cnblogs.com/wuyudong/p/5907736.html,转载请注明源地址. 采用GridView来实现,和ListView使用方式类似,列数(3列) 首 ...