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