对象
有两部分组成
对象的组成元素
是对象的数据模型,用于描述对象的数据,又被称为对象的属性,或者对象的成员变量。
对象的行为
是对象的行为模型,用于描述对象能够做什么事情,又被称为对象的方法
对象的特点
每一个对象都是独一无二的
对象是一个特定事物,他的只能是完成特定功能
对象是可以重复使用的
什么是面向对象
再编程的时候数据结构(数据组织方式)都是通过对象的结构进行存储(也就是属性、方法),实质上就是把生活中药解决的问题都用对象的方式进行存储,对象与对象之间通过方法的调用完成互动
为什么要使用面相对象
对象的描述方式更加贴合真实的世界,有利于大型业务的理解,在程序设计的过程中用对象的视角分析世界的时候能够拉近程序设计与真实世界的举例。
面向对象的基本思路
第一步:识别对象
任何实体都可以被识别为一个对象
第二步:识别对象的属性
对象里面存储的数据都被识别为属性,对于不同的业务逻辑,关注的数据不同,对象里面存储的属性也不同
第三步:识别对象的行为
对象自己属性数据的改变,对象和外部交互
面相对象的基本原则
对象内部是高内聚的
对象只负责一项特定的职能(职能可大可小),所有对象相关的内容都封装到对象内部
对象外是低耦合的
外部世界可以看到对象的一些属性(非全部),外部世界可以看到对象可以做某些事情(并非全部)
什么是类
物以类聚,把具有相似特征的对象归类到一个类中,类定义了这些相似对象拥有的相同属性和方法,类是相似对象的描述,称为类的定义,是该类对象的蓝图或者原型,类的对象成为类的一个实例(Instance),类的属性和方法统称为类成员
类的实例化
就是通过类定义创建一个类的对象。
PHP中对象引用赋值
对象引用用于访问对象的属性和方法,$james、$james1和$james2都是对象的引用;$james和$james1是对象的两个独立引用;$james2是$james1的影子,使用对象的同一个引用,任何一个赋值为null相当于删除了同一个引用。
class NBAUser{
public $name;
public $age;
public $number;
public function test(){
echo "NBAUser::test方法 \n";
}
public function test1(){
echo "NBAUser::test1方法 \n";
}
}
/**
1.parent关键字可以用于调用父类中被子类重写了的方法
2.self关键字可以用于访问类自身的成员方法 && 静态成员 && 类常量,不能用于访问类自身的属性,使用常量的时候不需要再常量名称前面添加$符号
3.static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性前面添加$符号
**/
class AmNBAUser extends NBAUser{
const CONST_VALUE = '一个常量';
private static $sValue = '静态量';
public function test($tmp=null){
echo "AmNBAUser::test方法被调用了 \n";
parent::test();
self::called();
echo self::CONST_VALUE . '\n';
echo static::$sValue . '\n';
}
public function called(){
echo "AmNBAUser::called被调用了";
}
}
$james = new NBAUser();
$james->name = 'james';
$james->age = 31;
$james->number = 23;
$james1 = $james;
$james2 = &$james;
PHP中面向对象中的接口
接口就是把不同类的共同行为进行定义,但是接口不去实现,然后在不同的类里面实现不同的功能,其实就是制作一种规范,一种标准,一旦某个类实现了某个接口,那么就必须实现接口定义的方法,接口也可以继承接口,但是接口是不能实例化的。
interface ICanEat{
public function eat();
}
interface ICanPee extends ICanEat{
public function pee();
}
class Human implements ICanEat{
public function eat(){
echo "人在吃";
}
}
class Animal implements ICanEat{
public function eat(){
echo "动物在吃";
}
}
$man = new Human();
//我们可以使用instanceof来鉴定某个对象是否实现了某个接口
var_dump($man instanceof ICanEat)
function checkEat($obj){
if ($obj instanceof ICanEat) {
$obj -> eat():
}else{
echo "这个对象不能吃";
}
}
PHP中面向对象中的多态
因为接口的方法实现可以有很多,所以对于接口里面定义的方法具体实现是多种多样的,这种特性我们称为多态,比如A接口有两个实现B和C,B和C对A里面定义的方法的实现可以是不同的,这种现象就是多态
PHP中的抽象类
abstract 关键字用于定义抽象类,在抽象方法前面添加关键字可以标明这个方法是抽象方法,不需要具体的实现,而抽象类中也可以包含普通的方法,有方法的具体实现,继承抽象类的关键字是 extends ,继承抽象类的子类需要实现抽象类中定义的抽象方法。
abstract Class ACanEat{
abstract public function eat($food);
public function breath(){
echo "呼吸新鲜空气";
}
}
class Man extends ACanEat{
public function eat($food){
echo "男人在吃 {$food}";
}
}
PHP中的魔术方法
PHP中提供了很多的魔术方法,其实就是系统会自动调用的方法,我们来简单看一下
class ClassName extends AnotherClass{
//构造函数(方法)
function __construct(){
}
//当对象被当做String使用时,这个方法会自动被调用
//echo $obj;
function __tostring(){
}
//当对象被当成方法调用的时候,这个方法会自动被调用
//$obj(4)
function __invoke(){
}
//当对象访问不存在的方法名称时,该方法会自动被调用
function __call(){
}
//当对象访问不存在的静态方法名称时,该方法会自动被调用
function __callStatic(){
}
//以上两个方法在PHP中也被成为方法的重载(注意区分重写),通过这两个方法,同一个方法的名称的调用可以对应不同的方法实现
//在给不可访问的属性赋值时会调用该方法
function __get(){
}
//读取不可访问属性的值时会调用该方法
function __set(){
}
//当对不可访问属性调用 isset()或者 empty() 时会自动调用该方法
function __isset(){
}
//当对不可访问属性调用 unset()时,会自动调用该方法
function __unset(){
}
//所谓的不可访问属性,实际是在调用某个属性时发现这个属性没有被定义,这时候不同的操作会触发不同的魔术方法,这几个方法也被称为属性重载的魔术方法
//当复制一个对象,也就是其实也难怪 clone 关键字的时候自动调用该方法
function __clone(){
}
//析构函数(方法)
function __destruct(){
}
}
以上总结了PHP中的面相对象的思想与具体的实现,并且阐述了面向对象中的三大特性:封装,继承和多态,希望能够了解面向对象~