php进阶

定义类
class ClassName
{
包含属性和方法
}
class:关键字,说明声明了一个类
ClassName:类名
满足标识符的定义规则

一个php引入另一个php文件的类:require_once "view.php"

对象是通过类实例化出来的,使用new关键字来生成一个对象
语法:
$对象名称 = new 类名称();
如果定义了一个person之后,创建该类的对象
$p1 = new person();
$p2 = = new person();

在类的外部,访问对象中的成员,可通过“对象->成员”的形式
在类的内部,访问访问类的成员(属性或方法),使用“$this->成员”代表本对象的引用.
如:
Function name(){
$this->name;
$this->say();
}

构造方法

在类的外部,访问对象中的成员,可通过“对象->成员”的形式
在类的内部,访问访问类的成员(属性或方法),使用“$this->成员”代表本对象的引用.
如:
Function name(){
$this->name;
$this->say();
}

封装
封装是面向对象三大特征之一,含义有两层:
--把对象的属性和方法结合到一起
--尽可能隐藏对象的内部细节,对外只保留 有效的接口
反应在设计上就是,封装可以保证度对象以外的部分不能随意读写对象的内部数据
PHP中的封装涉及到三个关键字public、protected,private
类成员的可见性
为控制类成员的可见性,限定对属性和方法的访问,使用以下三种访问修饰符:
--public表示全局,类内部外部子类都可访问
--protected表示受保护的,只有本类或子类或父类可以访问
--private表示私有的,只有本来内部可以使用
注意:只要属性前有修饰符,要把var去掉,var等同于public的访问权限
继承
PHP中只支持单重继承
通过继承生成的子类,将自动拥有父类的有关属性和方法(父类中的私有成员除外)
子类还可以定义自己的新属性和相应的新方法
必要时,子类可重新声明父类的同名属性或重新定义父类的同名方法
继承使用extends关键字
class B extends A{
}
子类覆盖父类中同名的方法时,在子类里可以使用如下两个方法调用父类的方法
-- 一种是使用父类的“类名::”来调用父类 中被覆盖的方法;
-- 一种是使用 “parent::”的方式来调用父 类中被覆盖的方法;
访问修饰符protected
Protected的成员不能被类的外部代码访问。但是该类的子类有访问权限,可以进行属性、方法的读及写操作,该子类的外部代码包括其子类都不具有访问其属性和方法的权限
Final关键字
Final可以修饰类和方法
被final修饰的类不能被继承
被final修饰的方法不能被覆盖
Static关键字
Static修饰的属性是静态属性,静态属性是属于类的,不属于任何对象实例,这样的属性在内存中只有一个,多个对象公用这一个属性
静态属性不可以由对象通过->操作符访问
静态属性由类名::$静态属性来访问
如:

class parentq{
public static $name="ishishen";
function shen(){
echo "alading".PHP_EOL;
}
}
echo parentq::$name;
Static修饰的方法成为静态方法,静态方法只能使用静态成员,不能访问非静态成员
静态方法中访问静态属性不能用$this,而是使用self::$静态属性或类名::静态属性
非静态方法中访问静态属性也是使用self::$静态属性或类名::静态属性
类外访问静态方法可以使用类名::静态方法直接调用,也可以使用对象之间调用

Const关键字
PHP中定义常量用define()函数,但在类里使用const定义常量,常量的值不能被修改
在类外使用时使用类名::常量名(没有$),方法内使用时使用self::常量名
如:

class fruit{
public $weidao="meiwei";
const colors="huang";
const neme="apple";
function shuchu(){
echo self::colors;
}
}
$w=new fruit;
echo $w::neme;

__call方法处理调用错误
使用对象调用方法时,如果方法不存在,运行时程序就会退出不能继续执行
如果定义了__call()方法,在试图使用对象调用不存在的方法时,就会提示调用的方法和使用的参数不存在,但程序扔可以继续执行
该方法声明是包含两个参数,第一个参数string型,是调用不存在方法时的方法名,第二个是array型,是调用的不存在的方法的参数
class persona{
public $name1;
public $sex;
public function __call($name, $arguments)
{
echo '调用不存在的动态方法名',$name,'<br>';
echo '以下是通过——call方法显示的参数','<br>';
}
function day(){
var_dump(11);
}
}
$person=new persona();
$person->name1();
$person->day();

 

 

 

autoload()函数
调用一个类的时候,必须要先将该类所在的文件引入(include“xxx.php”),如果我们在一个页面里调用的类很多,那不得不使用许多include“xxx.php”,显的很麻烦
遇到以上情况,只要定义autoload()函数帮我们解决问题
该函数不是类方法,是独立的方法,有一个string类型的参数是声明不存在类的类名,如:
function __autoload($className) {
Include $className.”.php”;
}

抽象方法和抽象类
在类中没有方法体的方法叫抽象方法,即方法名后面没有大括号和具体内容,方法名后面直接是分号,抽象方法使用abstract来修饰
--如:abstract function person();
如果类中有抽象方法,那么该类就要被abstract修饰,该类成为抽象类
抽象类必须有抽象方法,但也可以有成员属性和非抽象方法
抽象类是一种规范,要求子类去遵守,子类继承抽象类后,安装子类的需求将抽象类中的抽象方法实现

抽象方法和抽象类
在类中没有方法体的方法叫抽象方法,即方法名后面没有大括号和具体内容,方法名后面直接是分号,抽象方法使用abstract来修饰
--如:abstract function person();
如果类中有抽象方法,那么该类就要被abstract修饰,该类成为抽象类
抽象类必须有抽象方法,但也可以有成员属性和非抽象方法
抽象类是一种规范,要求子类去遵守,子类继承抽象类后,安装子类的需求将抽象类中的抽象方法实现
抽象方法是作为子类重载的模板来使用,子类继承抽象类时必须将其中的抽象方法全部实现,否则子类仍然不能被实例话

abstract class mode{
var $test;
abstract function fun1();
abstract function fun2();
function fun(){

}
}
class test extends mode{
function fun1(){}
function fun2(){}
}
$test=new test();

接口

接口
PHP不支持多继承,为了解决该问题,引入接口的概念
抽象类是一种特殊的类,接口是一种特殊的抽象类,当类中所有的方法都是抽象方法时,此时就换一种称谓,类就叫做接口
接口中不能声明变量,接口中所有的成员都是public权限的,包括子类实现时也要使用public权限
接口的声明
interface接口名{
}
接口中可以定义常量,且要赋初值
接口中所有的方法都是抽象的,所以可以将sbstract去掉
接口中所有的方法的访问权限都是public,所以也可以将public去掉
接口可以使用extends继承其他接口
接口的实现
定义一个子类,使用关键字implements实现接口中的全部抽象方法
一个类可以同时实现多个接口
一个类既可以继承父类也可以同时实现多个接口
Instanceof运算符
该运算符可以判断一个对象是否是一个类
多态
多态性是指一段程序能够处理多种类型的对象的能力
PHP中虽然可以实现多态,但和C++和JAVA这些面向对象的语言相比,多态性并不是那么突出,因为PHP本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对象的问题
重载和重写:PHP的同一个不能出现同名方法,所以所谓的重载其实和JAVA中的重写类似,指的是在子类中可以重新定义父类中的方法
对象串行化
两种情况我们必须把对象串行化,第一种情况就是把一个对象在网络中传输的时候要将对象串行化,第二种情况就是把对象写入文件或数据库的时候需要用到串行化
串行化有两个过程,一是串行化,就是把对象转化成二进制的字符串,我们是用serialize()函数来串行化一个对象,另一个是反串行化,就是把对象转化的字符串再转化成对象,我们使用unserialize()函数来反串行化一个对象
serialize()函数
PHP中serialize()函数的参数为对象名,返回值为一个字符串,serialize()返回的字符串含义模糊,一般我们不会解析这个字符串来得到对象的信息,我们只把返回来的字符串传到网络一端或保存到文件中即可
 
$str=serialize(array('a'=>1,'b'=>2));
echo $str;
输出a:2:{s:1:"a";i:1;s:1:"b";i:2;}
unserialize()函数
PHP中unserialize()函数来反串行话对象,这个函数的参数是serialize()函数的返回值,输出是组织好的对象
 
$arr=unserialize($str);
           var_dump($data); 
           输出数组array('a'=>1,'b'=>2)
__sleep函数和__wakeup函数
在对象串行化的时候,会调用一个__sleep函数来完成一些睡前的事情,而在重新醒来,即由二进制串重新组成一个对象的时候,则会自动调用PHP的另一个函数__wakeup(),做一些对象醒来就要做的动作
__sleep()函数不接受任何参数,但返回一个数组,其中包含需要串行化的属性,未被包含的属性将在串行化时被忽略,如果没有__sleep()方法,PHP将保存所有属性
class Person
{
public $name;
    public function __construct($name=“”) {
    $this->name = $name;
    }
    public function __sleep() {
    echo "当在类外部使用serialize()时会调用这里的__sleep()方法";
    $this->name = base64_encode($this->name);
    return array('name'); // 这里必须返回一个数值,里边的元素表示返回的属性名称    
}
    public function __wakeup() {
    echo "当在类外部使用unserialize()时会调用这里的__wakeup()方法";
    $this->name = 2;
    // 这里不需要返回数组
}
}
    $person = new Person('小明'); // 初始赋值
    var_dump(serialize($person));
    var_dump(unserialize(serialize($person)));
 

 

posted @   Rainierzz  阅读(292)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示