一、什么是面向对象编程、为什么出现面向对象?
面向对象编程(Object Oriented Programming
,OOP
,面向对象程序设计
)是一种计算机编程架构。
OOP
的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。 例如(笔记本电脑、他是有CPU、内存、光驱、显示屏组成)。oop技术为编程人员敞开了 一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的可重用性。
PHP本身不是一个真正的面向对象语言。PHP是一个混合型语言
,你可以用面向对象编程
、也可以使用过程化编程。但遇到大型项目的时候,代码量越大,维护成本越大,而且越难,修改一个功能可能涉及很多行代码,所以我们要用面向对象、一次封装多次使用、更加灵活、代码更加简洁、有很强的扩展性、各执其责、更加清晰。(就好比CPU它只负责计算、硬盘只负责储存一样、功能更清晰,如扩展、我内存不够加一个内存一样)。
二、oop软件工程的三个目标
重用性
、 扩展性
、 灵活性
三、什么是类
类(class)是对一类事物的描述,是抽象的、概念上的定义、是具有某些相同属性和功能行为的一些对象的集合。(怎么理解呢?例如:人做区分,男人、女人,属性:女、男。行为:思考、做饭,这样能区分是人。动物也一样、动物的行为)。
在面向对象的编程语言中、类是一个独立的程序单元,它应该有一个类名并包括属性说明和功能说明两个主要部分。(例如 高富帅是一类人,是个类,属性:高,长得有肌肉。行为:开豪车等。)
三、对象的概念
- 对象是系统中用描述客观事物的一个实体或实例。
如何理解?我定义一个类是美女。但你说不出清楚、并不具体,他是个抽象的。如:范冰冰是个美女。那范冰冰则是一个实例,用范冰冰证明美女就是这个样子的。类是抽象的,对象是实体的
- 一个对象由一些属性和某功能特征组成。
它反映该事物在系统中需要保存的信息和发挥的作用;它是一些属性和有权对这些属性进行操作的一些功能的封装体。
四、类和对象的关系
类可以创建多个对象、对象和对象之间并不同。如美女:实例范冰冰、林心如
。
类和实体化结果就是对象,而对一类对象的抽象就是类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。
拿猫类打比方、布偶猫、和伯曼猫。他们有相同的属性和行为,但是他们不一样,眼睛鼻子的大小、特性、习性有不一样的地方。
五、类的声明和对象的创建
1、类(class)和对象(object)是面向对象编程的核心。
面向对象编程的基本单元就是对象,但对象又是类的一个实体(通过类实例化出来的)。
声明类的语法 (语法潜规则、类的首字母大写、采用驼峰式命名)
/**
* 声明一个Cat类
*/
class Cat{
}
2、对象的创建
对象是实际存在的该类事物的每个个体,因而也称实例,所以创建对象的过程称为创建对象,也称之为实例化。
创建对象语法 $对象名称 =new 类名称();
/**
* 声明一个Cat类
*/
class Cat{
}
$cat = new cat(); //var_dump($cat) 出现的结果是object类型 就是对象
六、类的属性和定义
1、属性的定义
属性(类的成员变量)指在类(class)中的共同属性,它是静态的,可以被方法操作的。在声明时,必须使用public
/private
/protected
之一进行修饰,定义变量的访问权限。
<?php
function t()
{
echo 1;
}
class tt{
}
class test{
public $age= 1>0?2:8;//老版本不行,php7可以。以下是都不行的
// public $static=fopen('1.php','ab');
// public $t=t();
// public $cc=new tt();
}
$a=new test();
echo $a->age;
php7
可以)、函数、对象、资源类型。
2、类的方法定义
方法(类的成员函数)指类(class)中的一些功能行为,它是动态的、可执行的。通过在类定义中声明函数,即创建了类的方法。
以下示例演示、方法和对象内部的变量访问。
<?php
class test{
public $age;
function __construct($age="0",$name="张三")
{
$this->age=$age;
//内部访问需要借助关键词$this
$this->name=$name;
//修改属性 $this->属性 = 新值 ,访问属性 $this->name
}
function test($a=29)
{
echo $a,"</br>";
$this->t();
//访问方法 $this->方法 方法里面调用方法
}
function t(){
echo 1;
}
function setAge($age)
{
$this->age=$age;
}
function getAge()
{
return $this->age;
}
代码潜规则设置一个值用set为前缀 获取为get
}
$dd=new test("23");
//首先示例化一个对象;然后使用一个特殊的操作符“->” 来完成对象属性和成员方法的访问。
echo $dd->age."<br/>";
//访问属性:对象->属性
echo $dd->name,"</br>";
$dd->test();
//访问方法:对象->方法;
$dd->name="李四";
//修改属性:对象->属性 = 新值;
有意思的一件事、下面例子
<?php
class test{
public $name="李四";
public $age=23;
}
$p=new test();
$p1=$p;
echo "\$p的name属性->".$p->name," \$p1的name属性->".$p1->name;
echo "<br/>";
$p1->name="张三";
echo "<br/>";
echo "\$p的name属性->".$p->name," \$p1的name属性->".$p1->name;
var_dump($p1===$p); true;
$p2=new test();
var_dump($p1===$p2);false; //内存地址不一样
这是为什么呢?
因为在PHP中 对象的赋值是通过引用来实现的..
类似下面的例子
<?php
$a="asd";
$b =&$a;
echo $a,"<br/>";//这里输出:asd
echo $b,"<br/>";//这里输出:asd
$b="dsa";
echo $a,"<br/>";//这里$a的值变为dsa 所以输出dsa echo $b;//这里输出dsa
<?php
function test(&$a){
$a=$a+100;
}
$b=1;
echo $b;
//输出1
test($b);
//这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了
echo "<br/>",$b;//输出101
?>
这么的就好理解了、虽然$p1的对象属性进行了更改、但是也改变了$p,因对对象的内存地址是同一个。