类的声明
-
定义类 <?php
权限修饰符 class 类名{
类体;
}
?>
- 权限修饰符是可选项,可以使用public,protected,private或者省略这三者
- class是创建类的关键字
- 类名是所要创建类的名称,必须写在class关键字之后,类名称之后必须有大括号
- 类体是类的成员,类体必须放在类名后面的大括号内部
-
成员属性
-
在类中直接声明的变量成为成员属性,可以在类中声明多个变量,即对象有多个成员属性 -
成员属性的类型可以是PHP中的标量两类型和复合类型,但是使用资源和空类型是没有意义的 -
成员属性的声明必须用关键字来修饰,如public,protected,private等,如果不需要特殊的定义就用var关键字修饰 <?php
class conndb{
var $dbtype
var $host;
var $user;
var $pwd;
}
?>
-
成员常量 在类中定义常量 <?php
class conn{
const pi=3.1415926;
}
?>
常量的输出不需要实例化对象,直接由类名+常量名调用 ? 类名::常量名(::成为作用域操作符) -
成员方法 在类中声明的函数称为成员方法,一个类中可以声明多个函数,即对象可以有多个成员方法 <?php
class student{
function gets(){
}
}
?>
在类中的成员属性和成员方法的声明都是可选的,可以同时存在,也可以单独存在 类的实例化
-
对象的创建 $变量名=new类名称([参数]);
- 变量名:类实例化返回的对象名称,用于引用类中的方法
- new:关键字,表明要创建一个新的对象
- 类名称:表示新对象的类型
- 参数:指定类的构造方法用于初始化对象的值
-
<?php
class conn{
function conn{
}
}
$ct=new conn();
$ct2=new conn();
?>
一个类可以实例化多个对象,且每个对象都是独立的,互不联系 -
访问类中的成员 对类进行实力化后可以通过对象的应用来访问类中的公有属性和公有方法,即被关键字public修饰的属性和方法,访问格式如下 ? $变量名=new 类名称([参数]); ? $变量名->成员属性=值; ? $变量名->成员属性; ? $变量名->成员方法; "$this"操作符 类内调用成员属性,一般用于成员方法内部调用类的成员属性 <?php
class saler{
public $count=100;
protected $discount=80;
private $money=100;
public function getall(){
var_dump($this);
echo $this->count,$this->discount,$this->money;
}
}
$s=new saler();
$s->getall();
?>
面向对象开发规范
-
构造方法 构造方法的实现:在类中增加一个方法__construct()即可 <?php
class saler{
public $count;
private $money;
public function __construct(){
echo __CLASS__;
}
}
new saler;
$=new saler();
?>
? 构造方法也是一个普通方法,不普通的地方在于,类实例化得到的对象会马上自动调用,构造方法的意义:
? 构造方法是对象实例化的时候用来初始化对象的资源的,所以通常是用来初始化对象或则其他资源初始化
2.析构方法
- 析构方法的实现:在类中增加一个__destruct(){
? //方法体,通常完成一些在对象销毁前的清理任务 }
-
析构方法属于类中的可选内容 3.对象传值
- 对象传值是引用传递,不管给多少给对象赋值,内存中只有一个对象
-
对象传值就是保存对象中的变量赋值给另一个对象
面向对象的封装
-
公有成员关键字public 公有成员可以在程序的任何地点(类内,类外)被其他的类和对象调用。子类可以继承和使用父类中所有的公有成员,所有方法在默认状态下也是公有的 -
私有成员关键字private 被private关键字修饰的变量和方法,只能在所属类的内部被调用和修改,不能在类外被访问,即使是子类也不可以 <?php
class book{
private $bookname="PHP从入门到实践";
public function setname($bookname){
$this->bookname=$bookname;
}
public function getname(){
return $this->bookname;
}
}
$book=new book();
$book->setname("PHP自学视频教程");
echo $book->getname;
echo $book->bookname;
?>
3. ## 保护成员关键字protected
private关键字可以将数据完全隐藏起来,除了在本类以外,其他地方都不可以调用,子类也不可以,protected修饰的类成员,可以在本类和子类中被调用,其他地方则不可以被调用
```php
<?php
class car{
protected $carname="奥迪系列":
}
class smallcar extends car{
public function say(){
echo "调用父类中的属性:".$this->carname;
}
}
$car=new smallcar();
$car->say();
echo $car->carname;
?>
PHP中虽然没有对修饰变量的关键词做要求,但从面向对象的封装而言,一般使用private或protected关键字修饰变量
面向对象的继承
-
继承关键字extends <?php
class fruit{
var $apple="苹果";
var $banana="香蕉";
var $orange="橘子";
}
class fruitType extends fruit{
var $grape="葡萄";
}
$fruit=new fruitType();
echo $fruit->apple.",".$fruit->banana.",".$fruit->orange.",".$fruit->grape;
?>
-
"::"操作符
覆盖父类方法
-
覆盖父类方法,也就是使用子类中的方法将从父类中继承的方法进行替换,也叫方法的重写 -
覆盖父类方法的关键就是在子类中创建与父类中相同的方法,包括方法名称、参数和返回值类型 -
如果父类和子类都定义了构造方法,当子类的对象被创建后,将调用子类的构造方法,而不会调用父类的构造方法
static关键字 静态属性和静态方法 <?php
class web{
static $num="1";
static function change(){
echo "您是本站第".self::$num."位访客";
self::$num++;
}
}
$web=new web();
echo "第一次通过对象调用:<br>";
$web->change();
$web->change();
$web->change();
echo "<br>第二次通过类名调用:<br>";
web::change();
web::change();
?>
抽象类和接口
-
抽象类 抽象类是一种不能被实例化的类,只能作为其他类的父类使用,抽象类使用abstract关键字来声明 ? abstract class 抽象类名称{
abstract function 成员方法(参数);
abstract function 成员方法2(参数);
}
抽象类和普通类相似,包含成员变量,成员方法,两者的区别在于,抽象类至少要包含一个抽象方法,抽象方法没有方法体,其功能的实现只能在子类中完成,抽象方法也是使用abstract关键字来修饰的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8F8kJZmm-1636982295287)(C:\Users\25892\Desktop\isl实验室\面向对象abstract.png)] -
接口 PHP只支持单继承,使用接口可以实现多重继承,PHP可以实现多个接口
}
- 不要用public以外的关键字修饰接口中的类成员,对于方法,不屑关键字也可以,这是由接口类自身的天性决定的
- 接口和抽象类相同,都不能惊醒实例化的操作,也需要通过子类来实现,但是接口可以直接使用接口名称在接口外获取常量成员的值,接口类也可以用关键字extends继承
- 接口的应用
既然通过子类继承了接口中的方法,那么接口中的所有方法必须都在子类中实现,否则PHP将会报错
```php
<?php
interface person{
public function say();
}
interface popedom{
public function money();
}
class member implements person,popedom{
public function asy(){
echo "我只是一名普通员工,";
}
public function money(){
echo "我一个月的薪水是10000员";
}
}
$man=new member();
$man->say();
$man->money();
?>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtkruzGx-1636982295289)(C:\Users\25892\Desktop\isl实验室\接口.png)]
面向对象实现多态
-
通过继承实现多态 <?php
abstract class type{
abstract function go_type();
}
class type_car extends type(){
public function go_type(){
echo "我开着小轿车去拉萨";
}
}
class type_bus extends type(){
public function go_type(){
echo "我坐巴士去拉萨";
}
}
function change($obj){
if($obj instanceof type){
$obj->go_type();
}else{
echo"传入的参数不是一个对象";
}
}
echo "实例化type_car:";
change(new type_car());
echo "<br>";
echo "实例化type_bus:";
change(new type_bus);
?>
-
通过接口实现多态 <?php
interface type{
public function gotype();
}
class typecar implements type{
public function gotype(){
echo "我开着小轿车去拉萨";
}
}
class typebus implements type{
public function gotype(){
echo "我坐巴士去拉萨";
}
}
function change($obj){
if($obj instanceof type){
$obj->go_type();
}else{
echo"传入的参数不是一个对象";
}
}
echo "实例化type_car:";
change(new type_car());
echo "<br>";
echo "实例化type_bus:";
change(new type_bus);
?>
面向对象的其他关键字
-
final关键字 final修饰类说明该类不可以再被继承,也不能再有子类 final修饰成员方法说明该方法在子类中不可以进行重写,也不可以被覆盖,可以继承使用 -
clone关键字 $克隆对象名称=clone $原对象名称(克隆对象) 对象克隆成功后,它们的成员方法、属性以及值是完全相同的 克隆副本对象的初始化 <?php
class book{
private $object_type='book';
public function settype($type){
$this->object_type=$type;
}
public function gettype(){
return $this->object_type;
}
public function __clone(){
$this->object_type='computer';
}
}
$book1=new book();
$book2=clone $book1;
echo '对象$book1的变量值为:'.$book1->gettype();
echo '<br>';
echo '对象$book2的变量值为:'.$book2->gettype();
?>
instanceof关键字 可以用来检测当前对象属于哪个类 trait关键字 实现代码的重用 类中不允许定义与trait同名的属性 类中定义的方法会覆盖trait同 名的方法 <?php
trait eat{
public function show(){
echo 'eat::show()<br/>';
}
}
class man{
use eat{
eat::show insteadof eat;
}
}
$m=new man();
$m->show();
?>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FYHr6kSu-1636982295291)(C:\Users\25892\Desktop\isl实验室\trait.png)] 面向对象的常用魔术方法 __set()和__get()方法
__set()方法包含两个参数,分别表示变量名称和变量值,这个方法不需要主动调用,
__get()方法在对象外部获取私有成员属性的值,包含一个必要参数,即私有数据成员名,
<?php
class Person{
private $name='张三';private $sex='男';private $age=12;
function __get($property_name){
echo '在直接获取私有成员属性得时候,自动调用了这个__get()方法<br/>';
if(isset($this->$property_name))
{
return ($this->$property_name);
}else{
return NULL;
}
}
}
$p1=new Person();
echo '姓名:'.$p1->name.'<br/>';
echo '性别:'.$p1->sex.'<br/>';
echo '年龄:'.$p1->age.'<br/>';
?>
__isset()和__unsset()方法
? __isset()方法对私有的成员属性进行检测,
? __unset()方法在类的外部删除指定的私有成员属性,
__toSting()方法
<?php
class people{
public function __toString(){
return "我是toString的方法体";
}
$peo=new people();
echo $peo;
}
注意输出对象时,echo或print函数后面直接跟要输出的对象,中间不要加多余的字符,否则__toString()方法不会被执行
__autoload()方法
在指定的路径下自动查找和该类名称相同的文件,找到则继续执行,否则报告错误
(); /直接获取私有属性得值,会自动调用__get()的方法,返回成员属性的值/ echo ‘姓名:’.
p
1
?
>
n
a
m
e
.
′
<
b
r
/
>
′
;
e
c
h
o
′
性
别
:
′
.
p1->name.'<br/>'; echo '性别:'.
p1?>name.′<br/>′;echo′性别:′.p1->sex.’ ’; echo ‘年龄:’.$p1->age.’ ’; ?>
### __isset()和__unsset()方法
? __isset()方法对私有的成员属性进行检测,
? __unset()方法在类的外部删除指定的私有成员属性,
### __toSting()方法
```php
<?php
class people{
public function __toString(){
return "我是toString的方法体";
}
$peo=new people();
echo $peo;
}
注意输出对象时,echo或print函数后面直接跟要输出的对象,中间不要加多余的字符,否则__toString()方法不会被执行
__autoload()方法
在指定的路径下自动查找和该类名称相同的文件,找到则继续执行,否则报告错误
|