您的位置:首页 > 编程语言 > PHP开发

PHP面向对象学习笔记

2015-02-06 10:24 597 查看
学习基于《细说PHP》

类声明

class 类名{

}

类成员属性

class Person{

var $name;

}

成员方法

class Person{

function say(){

}

}

实例化对象

$person=new Person();

访问

$引用名->成员属性/成员方法(非静态)

对象成员方法引用成员属性用"$this"

class Person{

var $name;

var sayMyName{

echo $this->name;

}

}

构造方法与析构方法

构造方法:

function __construct([参数列表]){

……



析构方法:

function __destruct(){ //不带参

……

}

class Person{

var $name;

function __construct($name){

$this->name=$name;

}

function __destruct(){

echo "I am 析构";

}

}

封装

class Person{

private $name;

private $age;

function __construct($name,$age){

$this->name=name;

$this->age=age;

}

public function getName(){

return $this-name;

}

public function setAge($age){

$this->age=age;

}

public function getAge(){

return $this->age;

}

}

如果成员属性太多,用__set()

void __set(string name,mixed value)

class Person{

private $sex;

private $age;

private function __set($propertyName,$propertyValue){

if($propertyName=="sex"){

if(!($propertyValue=="男"||$propertyValue=="女")){

return;

}

}

else if($propertyName=="age"){

if($propertyValue>150||$propertyValue<0)

return;

}

$this->$propertyName=$propertyValue;

}

}

关于__get()

mixed __get(string name)

class Person{

private $name;

private $sex;

function __get($propertyName){

if($propertyName=="name")

return $sex;

else if($propertyName=="sex")

return "这是秘密";

}

}

测定变量是否存在

bool __isset(string name) //传入对象中的成员属性名作为参数,返回测定后的结果

void __unset(string name) //传入对象中的成员属性名作为参数,可以将私有成员属性删除

class Person{

private $name;

private $sex;

private $age;

……

private function __isset($propertyName){

if($propertyName=="name")

return false; //不允许测"name";

return isset($this->$propertyName);

}

private function __unset($propertyName){

if($propertyName=="name")

return; //不允许删"name"

unset($this->$propertyName);

}

}

继承

extends

class Person{

var $name;

function __construct($name=""){

$this->name=$name;

}

}

class Student{

var $school;

function study(){

echo $this->name."正在".$this->school."学习";

}

}

访问类型控制

public

没有限制,不加修饰的函数或者var的变量都是public

private

内部使用

protected

子类或子类的子类可以使用

重载

直接覆盖

注意:在子类中重写父类的方法时,一定要高于父类被覆盖的方法的访问权限

final

加在类或类中方法前,不能标识成员属性

作用:

类前,表示类不能被继承

类中方法前,不能被覆盖

static

static成员唯一,只有一个,无论有多少个类

static不能用this

外部:

类名::静态成员属性名;

类名::静态成员方法名();

类内:

self::静态成员属性名;

self::静态成员方法名();

单态设计模式:

一个类只有一个实例:

class F{

private static $obj=null;

private function __construct(){

//构造器私有

}

static function getInstance(){

if(is_null(self::$obj)){

self::$obj=new self();

}

return self::$obj;

}

}

$f=F::getInstance();

……

const

类中定义常量只能使用const

不加$符号

用self为访问

class M{

const C='FF';

function showConst(){

echo self::C."<br/>";

}

}

echo M::C;

……

instanceof关键字

使用这个关键字可以确定一个对象是类的实例、类的子类,还是实现了某个特定接口,并进行相应的操作

$man=new Person();

if($man instanceof Person){

echo '$man是Person类的实例';

}

克隆对象

使用clone

$p2=clone $p1;

如果要对成员变量重新赋初值,则在类中使用魔法方法 __clone()

类中通用方法__toString()

class B{

private function __toString(){

return "abc";

}

}

$b=new B();

echo $b;

尝试调用不存在方法时会出错,退出程序,有__call()时会调用此函数,程序继续执行

class B{

private function __call($functionName,$args){

echo $functionName; //调用的函数名

print_r($args); //参数列表

}

}

自动加载类

把类都分为单独的文件,当不知是否要使用类时可用此方法

function __autoload($className){

include(strtolower($className).".class.php"); //文件名为 className.class.php

}

对象串行化

串行化就是把整个对象转化为二进制字符串,serialize()

使用情况:

网络传输

保存在文件或数据库

反串行化:unserialize()

串行化时自动调用魔术方法sleep()

反串行化时自动调用魔术方法wakeup()

抽象类

abstract class A{}

抽象方法

abstract function func(){}

PHP单继承,因此使用接口技术

interface 接口名称{

//常量成员

//抽象方法

}

interaface One{

const C="One";

function func1();

function func2();

}

接口实现:

class 类名 implements 接口一,接口二,……{

}

继承与实现:

class 类名 extends 父类名 implements 接口一,接口二,……{

}

多态忽略
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: