荒废的周日-PHP之面向对象(三)

  hi  

又是开森的周六了。积攒的两周的服装,终于是大抵洗完了。大清晨的才来学点东西~~

壹 、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第2字能够用于访问类本身的分子方法,也足以用来访问自己的静态成员和类常量;无法用于访问类本人的品质;访问类常量时不用在常量名称前面加$符号
* 3.
static关键字用于访问类自个儿定义的静态成员,访问静态属性时要求在属性名前面添加$符号
*/

4.6 对象接口

10分首要!!!

–问题

不一致的类,有着相同的作为,但一样的作为又怀有不一样的完毕方式。

比如说人和动物都会吃东西,但吃的不二法门艺术又不太相同。

–定义

接口正是把分裂类的同步行为进行了概念,然后在不相同的类里面完毕分裂的职能。

–栗子 

//定义二个接口
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/>”;
PHP,}
}

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 …………..

 

相关文章