PHP--面向对象
来源:互联网 发布:斗鱼直播平台源码 编辑:程序博客网 时间:2024/05/19 05:38
PHP的一个类必须在一段代码段中,即一个“<?php ...... ?>”
php5.6.25
一个简单的类:
class PhpClass{ public $name; public function toString(){ return "PhpClass"; }}
定义成员方法: [关键词] function 方法名(){...}
访问成员方法: 对象名->成员方法
定义成员变量: [关键字] 成员变量名访问成员变量: 对象名->成员变量
关键字可以使用 public、private、protected、static和final中的任意一个
定义类常量: const 常量名
访问类常量: 类名::常量名
<?phclass PhpClass{ public $name; const PI = 3.1415926; // 不能有修饰词 public function toString(){ return "PhpClass"; } public function printPI(){ echo PhpClass::PI.'<br/>'; // 直接通过类名访问 } public function printName(){ echo $this->name; // 注意此处的写法 }}$lycClass = new PhpClass();echo $lycClass::PI.'<br/>'; // 通过对象访问echo PhpClass::PI.'<br/>';echo $lycClass->toString().'<br/>';$lycClass->name = "Lyc";$lycClass->printName();
构造方法和析构方法:
构造方法: 不写会默认一个
void __construct([mixed args [,...]]) 下划线为两个
析构方法:
void __destruct(void) 下划线为两个
php使用垃圾回收机制,不用 unset 函数析构方法也会自动被调用
class PhpClass{ public $name; //public function __construct(){} PHP不支持 C++、java 形式上的方法重载 public function __construct($name){ $this->name = $name; } public function __destruct(){ echo '析构一下...'; }}$lycClass = new PhpClass('lyc');echo $lycClass->name;//unset($lycClass); 不写也会调用 __destruct()
继承和多态:
继承: 在PHP中子类可以继承父类的所有public和protected修饰的成员变量和方法,包括构造方法。
声明继承的格式:
class subClass extendes superClass{
......
}
多态:(覆盖和重载两种,覆盖和c++、java中重写相同)
重载概念和c++、java中的重载概念相同,但实现方式不同,重载实例:
class PhpClass{ public $nae; // PHP中有很多以两个下划线开头的方法,被称为魔术方法*********************** /* __call()方法的作用是: 当程序试图调用不存在或不可见的成员方法时 * PHP会先调用__call()方法来存储方法名及其参数。__call()方法包含 * 两个参数,即方法名和方法参数。其中,方法参数是以数组形式存在的 */ function __call($name, $arguments){ // 通过count($arguments)获得参数个数 $argNum = count($arguments); //echo $argNum."***************<br/>"; if($name == 'right'){ // 一下方法调用中的 $this-> 不可省略 switch($argNum){ case 0: $this->right0(); break; case 1: $this->right1($arguments[0]); break; case 2: $this->right2($arguments[0],$arguments[1]); break; default: echo "参数可能多了,我不干了...<br/>"; } }else if($name == 'left'){ switch($argNum){ case 1: $this->left1($arguments[0]); break; case 2: $this->left2($arguments[0],$arguments[1]); break; default: echo "参数不对,我不干了...<br/>"; } }else{ echo "什么也不做..."; } } //几种实现重载的方法,方法名不相同 public function right0(){ echo 'right0<br/>'; } public function right1($arg){ echo 'right1 '.$arg.'<br/>'; } public function right2($arg1,$arg2){ echo 'right1 '.$arg1.' '.$arg2.'<br/>'; } public function left0(){ echo 'left0<br/>'; } public function left1($arg){ echo 'left1 '.$arg.'<br/>'; } public function left2($arg1,$arg2){ echo 'left1 '.$arg1.' '.$arg2.'<br/>'; }}$lyc = new PhpClass();$lyc->left(); // 此处实现重载$lyc->left('LEFT');$lyc->left('LEFT','LYC');$lyc->right();$lyc->right('RIGHT');$lyc->right(123,'LYC');$lyc->right(123,'lyc','right');
$this:
$this类似C++、java中的this,只能在类中使用,意思就是对象本身,切记是对象本身class LycA{ //若果LycA被LycB继承,通过LycB调用,$this就是LycB //若果LycA被LycC继承,通过LycC调用,$this就是LycC //总之哪个对象调用的,就是哪个对象 public function toString(){ //$this->toStr(); return get_class($this); } public function toStr(){ return get_class($this); }}class LycB extends LycA{ public function toString(){ echo parent::toString(); // 此处仍然是 LycB 尽管重写了父类中的toString()方法,仍然调用父类中的 echo parent::toStr(); // 此处仍然是 LycB return get_class($this); // LycB }}$lycB = new LycB();echo $lycB->toString().'<br/>'; // LycBLycBLycB$lycA = new LycA();echo $lycA->toString().'<br/>'; //LycA
::(parent、self、类名):
::可以在没有声明实例的情况下使用类中的属性和方法
class LycA{ const CONST_LYCA = 'CONST_LYCA'; public $namea = 'LycAClass'; static $staticA = 'staticA'; public function toString(){ //$this->toStr(); return get_class($this); } public function toStr(){ return 'LycA.toStr()'; } static function staticStr(){ return 'staticA'; }}class LycB extends LycA{ const CONST_LYCB = 'CONST_LYCB'; public $nameb = 'LycBClass'; static $staticB = 'staticB'; public function println(){ // parent 可以调用父类中的cosnt属性、static属性、static方法和一般方法,包括继承而来的。 // 类名、self 可以调用本类中的cosnt属性、static属性、static方法和一般方法,包括继承而来的。 //$this可以调用本类中的一般属性和方法,包括继承而来的 echo parent::CONST_LYCA.'<br/>'; echo self::$staticB.'<br/>'; echo LycB::toString().'<br/>'; echo $this->namea.'<br/>'; echo $this->toStr().'<br/>'; /* 在PHP中const、static修饰的属性和方法属于类,不属于对象,而$this是伪对象,不能调用 parent、self和类名可以调用const、static修饰的属性和方法,并且还可以调用一般方法(在类外使用有区别) */ }}$lycB = new LycB();$lycB->println();// 类名 在类外或外类中使用可以调用本类中的cosnt属性、static属性、static方法,包括继承而来的。相对在本类中使用缺少了一般方法的调用echo LycB::$staticB;//LycB::println(); //错误
public、protected、private、static、final:
public:公开,都可以访问
protected:本类和子类中可以访问
private:只有本类,子类也不可以
对于成员变量,必须指定关键字;对于成员方法,如果没有指定关键字,默认为public。
被final修饰的类不能被继承,被final修饰的方法不能被重写或覆盖。
抽象类:
抽象类不能实例化,至少要有一个抽象方法,也包含成员变量和成员方法,用abstract声明
abstract class AbstractName{ ...... }
抽象方法:abstract function abstractName();
接口:
PHP使用接口实现多继承,和java类似,只能包含一些未实现的方法和成员变量,不能用public以外的关键字修饰接口中的类成员
接口:
interface InterfaceName{
functioninterfaceName1();
......
}
实现接口:
class SubClass implements InterfaceName1,InterfaceName2...{
...所实现的接口中的方法
}
克隆对象:网上有不同版本的说法,这里测试结果也和网上的不全相同,具体情况请自行测试
在PHP5中,默认情况下对象 是通过引用传递的,和java的对象传递是相似的,赋值之后,两个变量保存的都是同一地址的引用。C++中的引用是给变量起别名
class SportObject{ private $object_type = 'book'; public function setType($type){ $this->object_type = $type; } public function getType(){ return $this->object_type; }}$book1 = new SportObject();$book2 = $book1;$book2->setType('computer');echo '对象$book1的值为:'.$book1->getType(); // computer$book3 = &$book1;$book3->setType('macbook');echo '对象$book1的值为:'.$book1->getType(); // macbook
如果要想复制的形式赋值的话,可以使用 clone
$book4 = clone $book1;
这样 $book4和$book1是不同的两个对象。改变一个不会影响另一个
__clone() 方法:在克隆对象的过程中,调用__clone()方法,进行相关操作
class SportObject{ private $object_type = 0; public function setType($type){ $this->object_type = $type; } public function getType(){ return $this->object_type; } public function __clone(){ $this->object_type = 'iphone'; }}$book1 = new SportObject();$book2 = clone $book1;echo $book2->getType(); // iphone
instanceof:
用于检测当前对象属于哪个类,基础父类,实现接口,都可检测
class A{}interface B{}class lyc extends A implements B{}$lyc = new lyc();$lyc instanceof lyc; // true$lyc instanceof A; // true$lyc instanceof B; // true
魔术方法:
PHP中有很多以两个下划线开头的方法,构造方法__construct(),析构方法__destruct(),__call,__clone(),这些方法被称为魔术方法
PHP中保留了所有以”__“开头的方法,所以只能使用已有的这些方法,不要自己创建。如果希望PHP调用这些魔术方法,首先必须在类中进行定义,否则PHP不会执行未定义的魔术方法。
__set():当程序试图写入一个不存在或不可见的成员变量时,PHP就会执行__set()方法。__set()方法包含两个参数,分别表示变量名称和变量值,不可省略
__get():当程序调用一个未定义或不可见的成员变量时,可以通过__get()方法来读取变量值。__get()方法有一个参数,表示要调用的变量名
class PhpClass{ private $type = 'book'; public function __get($name){ if(isset($this->$name)){ echo '变量'.$name.'的值为:'.$this->$name.'<br/>'; }else{ echo '变量'.$name.'未定义,初始化为0<br/>'; $this->$name = 0; // 此处会调用__set() } } public function __set($name,$value){ if(isset($this->$name)){ $this->$name = $value; echo '变量'.$name.'赋值为:'.$value.'<b/>'; }else{ $this->$name = $value; echo '变量'.$name.'被初始化问为:'.$value.'<b/>'; } }}$lyc = new PhpClass();$lyc->type = 'DIY'; // 变量type赋值为:DIY$lyc->type; // 变量type的值为:DIY$lyc->name; // 变量name未定义,初始化为0 // vbvbv变量name被初始化问为:0
__call()上面介绍过了
__sleep()
__wakeup()
__toString():当使用echo或print输出对象时,将对象转化为字符串。和java中的 toString() 作用类似
如果没有__toString()方法,直接输出对象将会发生致命错误(fatal error)。输出要注意,echo或print函数后面直接跟要输出的对象,中间不要有多余的字符,否则__toString()方法不会执行。
__autoload()
没介绍的以后再介绍吧
- 【面向对象】php面向对象
- php面向对象--php面向对象ppt
- PHP面向对象精要
- PHP 面向对象编程
- PHP面向对象编程
- PHP 面向对象技术
- php 面向对象
- PHP面向对象编程
- Php面向对象01
- PHP面向对象笔记
- PHP面向对象v1:
- php 面向对象学习
- PHP-面向对象-OOP2
- PHP-面向对象-OOP3
- PHP-面向对象-OOP4
- PHP-面向对象-OOP5
- PHP-面向对象-OOP6
- PHP面向对象技术
- leetcode:Brainteaser:Nim Game(292)
- Maven安装配置
- 新人报到
- RenderQueue 与 ZTest的区别
- 4.Median of Two Sorted Arrays
- PHP--面向对象
- NHibernate使用入门(四)
- 新人报到
- UsernamePasswordAuthenticationFilter 登录认证
- SublimeText3常用快捷操作
- 解决锁表问题
- 新人报到
- 大型网站架构之分布式消息队列
- 修改文件输出目录后,提示配置错误(VS2010)