PHP面向对象(一)
前言
下面所讲的知识点都是个人从书中和各种教学视频里总结出来的一些小知识,可能总结的不是很到位,如果有总结的不对的地方,还希望各位简友指点...希望这篇文章能够对初学者有所帮助。
刚开始接触面向对象的时候,听前辈们说这是最难的一个阶段,因为面向对象它是一种编程思想,光靠敲代码是不行的,一定要理解到其中的含义,并且能够熟练的运用这种编程思想。
那什么是对象呢?什么是类?类和对象有什么关系?类有哪些组成?....等等,话不多说,看下面。
面对对象:
就是把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。
面向过程:
自顶向下顺序执行,逐步求精;其程序结构是按功能划分为若干个基本模块,这些模块形成一个[树状结构]各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。程序流程在写程序时就已决定。
什么是类?
类就是分类、类别、模板、概念等,类是无形的,看不见、摸不着、不实际存在的。类是具有相同属性和行为(动作)的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。
什么是对象?
客观世界中任何一个实体都可以看成一个对象,对象看得见、摸得着,实际存在的。对象是构成系统的基本单位。任何一个对象都应具有这两个要素:属性(Attribute)和行为(Behavior)。
类和对象有什么关系?
对象来自于某个类,对象不能单独存在,没有对象就没有类,一个类可以产生千千万万个对象。对象和类的关系是:对象是类的实例,类是对象的模板。类是抽象的,不占内存的,而对象是具体的,占用储存空间的。在现实中,现有对象,后有类。但在电脑中,先有类,后有对象。
类的定义
//声明一个类的语法格式
class ClassName
{
//声明成员属性
//声明成员方法
}
class是定义类的关键字;
ClassName是定义类名称,命名方式与PHP变量一样,但不带$符号。
{}大括号内,是类的代表定义,类由成员属性和成员方法构成。
注意:类名要求首页字母大写,但不是必须的。类名如果是多个单词的话,应该用“驼峰式”命名。
成员属性,就是普通变量。
成员方法,就是普通函数。
类的成员属性
类的成员属性,就是指某个具有公共的特征、特性。类中定义的变量,就是类的成员属性;类的成员属性和普通变量的区别;类的成员属性必须要带权限修饰符,而普通的变量不需要。成员属性可以有默认值,也可以没有默认值。
定义成员属性的语法格式
权限修饰符 属性名称 = 属性值
权限修饰符
public (公共权限):在任何地方都可以访问;主要包括:类外、本类中、子类中都可以访问。
protected (受保护的权限):只能在本类中和子类中被访问,在类外不能被访问。
private (私有权限):只能在本类中被访问,在类外和子类中都无权访问。
类的成员方法
类的方法,就是某个类的公共行为或动作;与普通函数一样,都有返回值和参数;成员方法和普通函数区别:成员方法只能存在于类中。成员方法定义前可以添加访问权限修饰符。当然成员方法可以胜率权限修饰符,默认访问权限是public。
实例化对象的含义
定义类是为了生产对象,如果不生产对象,类就没有意义。一个类可以生产千千万万个对象,对象的作用就是帮我们干活。对象实例化的意思就是从一个类上来生产对象的过程。
语法格式
使用new关键字来创建对象。
JS创建对象的方法:var today = new Date();
PHP创建对象的方法:$obj = new Student();
//类的实例化:从类上创建对象的过程
//类的成员就叫对象或实例。
//一个类可以生产千千万万个对象。
$obj = new Student;//如果不需要参数,可以省略括号
$obj = new Stydent;//如果不需要参数,也可以带括号。
$obj = new Student(参数1,参数2);//带参数,必须加括号;
举例说明:
class Student
{//声明一个
public $name = "小明";
public $age = 14;
public function show(){
}
}
//类的实例化:从类上创建对象的过程
//类的成员就叫对象或实例。
//一个类可以生产千千万万个对象。
$obj1 = new Student;
$obj2 = new Student();
var_dump($obj1,$obj2);
//$obj1和$obj2是两个对象变量;student说明了每个对象必须归属于那个类。没有类,就一定没有对象!
对象属性操作
如何访问对象属性和方法?
在JS中,访问对象属性和方法,是通过“.”来访问的。例如:window.alert()、arrObj.length
在PHP中,访问对象属性和方法,是通过"->"来访问的。例如:$obj->name、$obj->showInfo()
echo "{$obj->name}的年龄是{$obj->age}岁!";
面向对象:增、删、改、查
增加(插入)属性的方法:
function insert($tableName,$fields,$value){
$this->query("INSERT INTO $tableName $fields VALUES$value");
}
删除属性的方法:
function delete($tableName,$condition){
$this->query("DELETE FROM $tableName $condition");
}
修改属性的方法:
function update($tableName,$change,$condition){
$this->query("UPDATE $tableName SET $change $condition");
}
查询属性的方法:
function update($tableName,$change,$condition){
$this->query("UPDATE $tableName SET $change $condition");
}
伪变量 $this 的使用
什么是伪变量 $this ?
在JS中,使用this关键字来代替当前对象,例如:this.src = './a.jpg'
在PHP中,使用$this变量来代替当前对象,例如:$this->name = '张三'
$this代表当前对象,是到当前对象的一个引用;
$this更像是一个对象指针,指向当前对象;
$this只能用在对象方法定义中,去调用对象的成员属性或成员方法。
只有创建对象后,$this变量才存在。类不会自动运行。
举例说明
//声明一个学生类
class Student {
//私有的成员属性
private $name = "小明";
private $age = 14;
//定义成员方法
private function showInfo()
{
echo "{$this->name}的年龄是{$this->age}岁!";
}
//类的实例化:从类上创建对象过程
//调用对象方法
$obj->showInfo();
//因为成员属性是私有属性,使用$obj调用showInfo()成员方法,
//只有将$obj对象的地址传递到showInfo()方法中,
// 在showInfo()方法用$this变量,来代替传进来的$obj对象。
类常量的定义
什么是类常量?
1:可以把在类中始终保持不变的值定义为常量;
2:常量的值必须是一个定值,不能修改,也不能删除;
3:类常量就是类的常量,是与类相关的,与对象无关。
4:类常量在内存中只有一份,不管创建多少个对象。
5:类常量可以极大节省服务器内存,可以被所有对象去共享。
类常量定义和调用格式
类常量没有权限,只有属性和方法才会有权限。
使用const来定义类的常量(局部常量);define()定义常量是全局常量。
//定义类常量的语法格式
const 常量名称 = 常量值
常量名称尽量全大写。
常量的值只能是一个定值,不能通过计算得到,也不能修改,不能删除。
const定义的常量只能被该类使用。
举个例子
//声明一个数据库类
class Db{
//定义类常量
const DB_HOST = 'localhost';
const DB_USER = 'root';
const DB_PASS = '123';
//公共的成员方法
public function showInfo(){
//通过“类名::常量名”形式来访问类常量
//"::"可以叫范围解析符,或者叫静态化调用方式
//类的东西,都可以成为静态的东西
$str = "主机名:" .Db::DB_HOST;
$str .= "<br>用户名:" .Db::DB_USER;
$str .= "<br>密码:" .Db::DB_PASS;
echo $str;
}
}
//在类外调用类常量:不用创建对象,可以直接调用类常量
$str = "主机名:" .Db::DB_HOST;
$str .= "<br>用户名:" .Db::DB_USER;
$str .= "<br>密码:" .Db::DB_PASS;
echo $str."<br>";
//创建数据库类的对象
$db = new Db();
$db->showInfo();
静态属性和静态方法
什么是静态属性和静态方法?
1:static关键字修饰的属性,就是静态属性;
2:static关键字修饰的方法,就是静态方法;
3:静态属性:就是类的属性,与类相关,与对象无关;
4:静态方法:就是类的方法,与类相关,与对象无关;
5:类的东西(类常量、静态属性、静态方法),通过"类名::"来调用;
6:静态属性或静态方法,在内存中只有一份,被所有对象去共享;
7:静态属性或静态方法的好处:就是为了节省内存。例如:创建了100个对象,而静态属性只有一份。
8:静态属性和类常量的区别:类常量在一次HTTP请求过程值永远不变;但是静态属性可以改变。
9:静态属性和静态方法,都可以加权限控制符,而类常量没有权限。
定义格式
//定义静态属性的语法格式
权限修饰符 static 属性名称 = 属性值
//定义静态方法的语法格式
权限修饰符 static function funcName(){
}
举个例子
//声明一个Db类
class Db{
//定义类常量
const TITLE = "<h2>数据库配置信息</h2>";
private static $db_name = "localhost";
private static $db_user = "root";
private static $db_pass = "123";
}
//公共的静态方法
public static function showInfo(){
$str = Db::TITLE;
$str .= Db::$db_host;
$str .= Db::$db_user;
$str .=Db::$db_pass;
echo $str;
}
//直接访问类的静态方法
Db::showInfo();
self 关键字使用
1:$this是指向当前对象的指针,而self是指向当前类的指针;
2:$this关键字用来调用对象的属性和方法;
3:self用来调用类常量、静态属性、静态方法;
4:$this关键字只能在成员方法中使用;
5:self关键字可以在成员方法和静态方法中使用;
举个例子
//声明一个Db类
class Db{
//定义类常量
const TITLE = "<h2>数据库配置信息</h2>";
private static $db_name = "localhost";
private static $db_user = "root";
private static $db_pass = "123";
}
//公共的静态方法
public static function showInfo(){
$str = self::TITLE;
$str .=self::showLine();
$str .= self::$db_host;
$str .= self::$db_user;
$str .=self::$db_pass;
echo $str;
}
//直接访问类的静态方法
Db::showInfo();
构造方法
什么是构造方法?
1:当使用new关键字创建对象完成时,第1个自动调用的方法,就是构造方法;
2:构造方法的名称是固定的:void __construct ([ mixed $args [, $... ]] )
3:构造方法可以带参数,也可以不带参数;构造方法不是必须的,是可选的;
4:构造方法的作用:对象初始化。例如:给对象属性赋值、数据库对象初始化(连接、选择数据库)
5:构造方法一定是成员方法。构造方法的权限可以自己指定。
6:构造方法一般不需要主动调用,都是自动调用的。
举个例子
//声明一个Student类
class Student
{
//私有的成员属性:在项目中成员属性一般都是私有的(private)或受保护的(protected)
//私有的成员属性,一般不给默认值,都是从类外传递进来的。
//类就是一个储存数据的地方,先把数据导入进来,生成语句,再导出去。
private $name;
private $age;
//公共的构造方法:对象初始化
private function __construct($name2,$age2)
{
$this->name = $name2;
$this->age = $age2;
}
//公共的显示学生信息
public function showInfo()
{
echo "{$this->name}的年龄是{$this->age}岁!";
}
//创建类的实例:后边参数传递给构造方法
$obj = new student("小明",14);
$obj->showInfo();
}
析构方法
什么是析构方法
1:对象销毁前自动调用的方法,就是析构方法;
2:析构方法的名称是固定的:void __destruct ( void )
3:析构方法不带任何参数;
4:析构方法的作用:垃圾回收工作,例如:断开到MySQL的连接
对象何时销毁?
网页执行完毕时,对象会自动销毁
举个例子
//声明一个student类
class student
{
//公共的析构方法
public function __destruct(){
echo "对象即将销毁!";
}
}//网页执行完毕时,析构方法自动调用
//创建类的实例
$obj = new student();
echo"这是网页最后一行代码<br>";
结束语
这篇文章只涵盖了我这几天所接触到的面向对象,并没有完全的总结,后续的学习中在持续更新吧,毕竟这个东西对我来说真的是挺难理解的。总结的可能不好,各位看官就将就着看吧。上面的例子可以复制到编辑器,然后自行查看效果。