PHP面向对象详解

编程之家收集整理的这篇文章主要介绍了PHP面向对象详解编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

面向过程 :每个小系统有着明确的开始和和结束 。开始和结束之间有着严谨的因果关系。

比如 :上帝创造一个人,如果有70亿人那就很麻烦

随机函数获取随机的数字 作为数组的下标,然后再从数组中获取对应下标的数字。

 

面向对象

引入例子 :女娲 人身蛇尾 , 用女娲造人引出类和实例 : 女娲造人前先 思考 人的形象 然后再造人

所以 :人的形象是抽象的,用来说明人的特点;而每一个人都是具体的,且符合人的形象

 

类 :所有对象共同点的一个抽象!(就是一个 制造说明书)

对象 :就是根据说明书制造出来的具体对象

类中有什么? 属性(比如人:身高,体重,姓名)

能干什么?功能(说活,吃饭)

用 变量 和 函数 分别模拟 属性 和 功能

面向对象中 ,方法即是函数 ; 属性即是变量 ,只是面相对象中一般说方法属性

 

new 类名();//直接产生一个对象并返回该对象

$a = new 类名(); //那么a对象就包含 类中声明的所有属性(类似关联数组)

 @H_301_35@ 

调用对应的属性值可以 $a -> name (name不用$);要调用对应的方法 $a -> say()

面向对象oo(object oriented)oop加编程

声明类的时候 :

内存分配给类一个空间,,里面存放着类定义的属性函数

new对象的时候 :

1、 申请内存,生成对象(属性集合)

2、 如果有构造函执行

3、 返回对象的地址

 

                       内存分配图

 

语法就是法律; 规范 就是 道德

(1)属性的初始化 不能是表达式 如 : $a = 1+3 ;  java中是允许的

(2)同一个域内(比如一个类中),函数不能重复定义(即是名字不能一样)

(3)在一个类里面,如果要调用系统同名的自定义函数,需要用$this,否则调用系统函数 ; 此外一个类里面 一个函数调用 不是他内部的变量或者它调用其他函数也要加 $this

 

构造函数 : __construct() , 注意前面是两个下划线 ; 当new对象(产生对象),调用 ; 构造函数不能被重载即是不能再有同名的

 

析构函数 :__destruct()在对象被销毁的时候调用函数 。 

如何销毁对象 :

1、显式销毁,unset(),直接赋值为null或者其他值

2、执行完最后一行代码自动销毁(如果之前已经销毁,则不再销毁)

 

 

对变量指向销毁问题

$a = new People(); //创建一个对象(new People()),并把使用权给变量$a($a是一个变量名,指向这个对象)

$a = $b = $c ;  //3个变量都指向内存中的同一个对象

unset($a);//unset,即是销毁对象(object),但有其他变量$b等仍然指向对象,那么该对象将不能被销毁,但是$a为null不再指向这个对象

 

this绑定

当一个对象调用一个它对应类的方法时,该方法执行之前先完成一个绑定,即是用

$this绑定到调用方法的对象(这样才能在方法内对这个对象的属性进行操纵),因为方法内如果想访问调用者(即是对象)的属性必须用$this;否则则理解为方法内部的一个局部变量

 

Java中不一样,函数不需要this也能访问方法外的变量

 

封装

封装的概念 : 通过修饰符 改变属性或者函数的访问权限 ,达到保护的作用。

光是封装起来是没意义的,还要供外部交互才行;所以通过一个开放的接口(即是一个函数)供外部操纵;内部的操作,不需要外部知道,从而隐藏内部的一些细节 。

如: 洗衣机,你只要点击启动程序的按钮就能洗衣服,不需要知道洗衣机内部怎么运行

权限修饰符 :private protected public

private修饰的属性只能在其 类里面 才能被访问到。

protected 本类和子类能访问

private访问权限的bug : 对象之间能够相互操作同一个类中的属性,导致一个对象能够修改另一个对象的属性

 

fatal error(致命错误

 

封装 操作数据库的 类

类似把某个功能的一段代码放在一个类中 ; 类里面的方法相互调用

用面向对象的思想 对数据库操作 (MysqL封装类)

比如把连接数据的操作封装到一个连接函数

连接数据库

发送 查询

对于select语句 返回查询数据数据

关闭MysqL连接

 

继承

子类继承父类属性方法,再进一步拓展自己的属性方法父类属性 和方法一般是一个归纳(所有对象都有的),提高代码的重新性

 

拥有问题 :子类继承父类,子类有父类所有的属性方法,在子类里面能够操作父类中非private修饰的属性或者方法,但是父类中对于private修饰的属性或者方法子类无法操作(类外的范围限制)

  

 

调用与覆盖问题 : 子类里面调用对应的属性时,子类没有覆盖父类中的属性或者方法,则调用父类中的属性方法,否则只调用子类中的,无论传参数是否对。private的调用除外

 

注意继承父类之后,子类再声明与父类一样的属性,权限符只能越来越宽松或者一样 。 如果父类属性有static,子类也必须有才能声明

 

★类内一般声明只属性方法,实例化或者输出等语句要写在方法里或者类外,否则报错

如果子类有和父类一样的方法,能使用parent::方法名()指定调用父类

 

 

构造函数是可以被继承的;如果子类中没有写构造函数,在实例化子类的时候就会调用父类的构造方法。如果子类重新写则覆盖且只调用子类的。

因此如果父类的构造函数是必须要调用,最好使用parent::__construct()调用一下(java不同,它会先调用父构造再调用子构造;PHP调用子构造)

比如 :数据库类中 父类构造函数有连接数据库,如果子类写了其他的话构造函数,则连接失败 (Java不同,父子都调用

 

在类外对象名只能调用类中public修饰的属性,其他的属性可以通过方法调用。一般不写则默认为public

 

 

多态

只抽象声明父类,具体的工作由子类对象完成

java出现多态是因为它是强类型语言(即是定义了类型不能随便改变),声明的类型 后 传送参数必须是该类型 。 声明参数时,声明为父类型,传参时,能够传子类型。以达到多态的效果。比如:

多颜色手电筒问题 :声明手电筒,并接受玻璃的参数。然后玻璃有多种颜色,以达到不同效果。则为多态

PHP是弱类型语言,本身没有对类型没有检测,因此简直变态,后来5.3以后,引入了对于对象类型的参数检测。限制了灵活性达到多态

  

 

static 静态属性

一般当 某个属性或者方法 是所有对象固有的(即是不改变),则声明为静态属性,节省内存,随时类名调用;无论函数调用多少次,只初始化第一次.,如 static $a = 1;

静态属性存在于类内存中,而不是对象的内存中。只要有类就能访问到,因此一个静态属性只有一个,改1全变;只能 类名::属性名 访问

 

 

静态方法

普通方法和静态方法都存在 类内存 中 且只有一个

但是静态方法用类名调用,不用this绑定;普通方法需要有对象才能用this绑定调用

 

安装ecshop的时候出现strict standard错误提示,原因是版本高,代码书写语法有误,静态方法调用非静态方法时出现问题。

 

非静态方法,是不能由类名静态调用的.但是 PHP中的面向对象检测的并不严格,

只要该方法没有$this,就会转化静态方法调用

但是,在PHP5.3的strict级别下,或者PHP5.4的默认级别

都已经对类名::非静态方法做了提示

则会提示:Strict Standards: Non-static method Human::eat() should not be called statically 

不能静态的去调用非静态方法 ; 有static修饰的变量和函数不能出现$this

 

isset($this) 这个时候判断有没对象进行绑定;

代码分析

  

 

this就是指向当前对象实例的指针,不指向任何其他对象或类

self, parent的用法  (::(域运算符号))

self:指向类本身,也就是self是不指向任何已经实例化的对象 ,self使用来指向类中的静态属性或者方法

self::$staticProperty

self::staticMothed;

 

parent: 指向父类的指针,一般我们使用parent来调用父类的构造函数

 

在引入自身的静态属性/静态方法,以及父类方法时,可以用到.

parent::$staticProperty

parent::Mothed;

 

 

 

★应该选择this还是parent

  

总结使用 

1: 修饰类的属性方法为静态属性,静态方法

2: static::method(), 延迟绑定

3: 在函数/方法中,声明静态变量用

总结

以上是编程之家为你收集整理的PHP面向对象详解全部内容,希望文章能够帮你解决PHP面向对象详解所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的PHP相关文章

面向过程:每个小系统有着明确的开始和和结束。开始和结束之间有着严谨的因果关系。比如:上帝创造一个人,如果有70亿人那就很麻烦随机函数先获取随机的数字作为数组的下标,然后再从数组中获取对应下标的数字。面向对象引入例子:女娲人身蛇尾,用女娲造人引出类和实例:女娲造人前先思考人的形象然后再造人所以:人的形象是抽象的,用来说明人的特点;而每一个人都是具...
php执行shell命令,可以使用下面几个函数:string system ( string $command [, int &$return_var ] )string exec ( string $command [, array &$output [, int &$return_var ]] )void passthru ( string $command [, int &$return_var ] )注意的是:这三个函数在默认的情况下,都是被禁止.
对于刚入门的PHP童鞋们来说,在循环体中的continue和break的作用总是分不清到底是什么意思,怎么用,两者到底有什么区别?接下来说几个例子,其实它们是很好区分的。<?php$tmpVar=[];for($a=1;$a++;$a<10){if($a==2){continue;}array_push($t
本文操作环境:linux5.9.8系统、PHP7.1版,DELLG3电脑nginx不能运行php文件怎么办?nginxphp-fpm配置不当,引起的php文件无法执行很久没去自己的网站,今天去看发现报50x的错误。网站是用nginx服务的。网上很多情况是因为nginx配置中location~.php${#roothtml;#fastcgi_pas
看到题目说任意文件读取漏洞1.我们看到url中get参数是hello,页面则显示hello的页面,也就是说我们要构建一个参数对应到flag的页面之后就去访问2.看到访问flag的页面显示nonono,证明我们访问到了flag页面,但是没有flag,怀疑是被隐藏了,所以我们就试着读取flag页面的源码3.需要知道
1<?php2//乘法口诀3echo'<tablewidth="800"height="200"border="1">';4for($i=1;$i<=9;$i++)5{6echo'<tr>';7for($j=1;$j<=$i;$j++)8
1<!--找出7017-9999的能被3整除的数之和,并统计有多少个-->2<?php3$s=0;4$count=0;5for($i=7017;$i<=9999;$i++){6if($i%3==0){7$count++;8$s+=$i;9}10}11echo$s;12echo"&lt