PHP面向对象详解(三)
《:PHP面向对象详解(三)》要点: PHP应用面向对象 对象概念是面向对象技术的核心.在显示世界里我们所面对的事情都是对象,如计算机、电视机、自行车等.在面向对象的法式设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象. 对象的主要三个特性 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 面向对象模型 面向对象的概念: oop(面向对象的编程)它能是其代码更加简洁易于维护而且具有更强的可重性 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-> --小结 /** 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{ --小结 /** 4.5 数据拜访 先把final都去掉 --parent 然后再子类中的办法中写 parent::test(); 运行后会发现,依然可以通过parent的关键字调用父类中,即使是被重写的数据 --self 然后在父类中的办法test中写 self::test1(); 运行后,发现self可以调用同一个类中的数据(其他办法/静态变量/常量const) --小结 /** 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"); ?接口本质上也是类,可以被继承/继承,但是使用继承接口的接口,所有父类、“爷类”的办法都要有具体实现. --小结 /** aaaaaaaaaaaaaa bu xiang xie le.................... ming tian yao ge .............. 以上内容是小编给年夜家介绍的PHP面向对象详解(三),希望年夜家喜欢. 《:PHP面向对象详解(三)》是否对您有启发,欢迎查看更多与《:PHP面向对象详解(三)》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |