PHP面向对象学习笔记

学习基于《细说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 接口一,接口二,……{
}

多态忽略
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值