您现在的位置是:首页  > 后端  > PHP PHP

面对对象笔记

2020-05-17【PHP】1730人已围观

简介●面对对象编程  面对对象编程的一种思想。  面对过程:将每个步骤,分别实现,以此调用即可。  面对对象:1)确定对象所具有的属性  2)为对象增加相应的能力            3)让每个对象分别调用器的能力完成业务逻辑  ⊙为什么要面向对象  1)可重复使用 2)传值即可调用 3)单独存在  ⊙对象object    复合型数据类型,一个对象可以多次使

●面对对象编程

  面对对象编程的一种思想。

  面对过程:将每个步骤,分别实现,以此调用即可。

  面对对象:1)确定对象所具有的属性  2)为对象增加相应的能力

            3)让每个对象分别调用器的能力完成业务逻辑

  ⊙为什么要面向对象

  1)可重复使用 2)传值即可调用 3)单独存在

  ⊙对象object

    复合型数据类型,一个对象可以多次使用

    实体对象:现实业务逻辑中的实体,在计算机语言中的映射。

    对象具有属性property、方法method。

  ⊙如何得到对象

    设计对象结构(定义类),依据结构得到对象(实例化类);

  ⊙定义类class

    类:对象的抽象称为类,类决定了对象的结构。

    ⊙类与对象的关系

    图纸与建筑物的关系。

    内存关系:类是代码区,编译好待执行的代码,

      对象是数据区,代码运行时所保存数据的地方。

    class 类名{

    public $name; public $age;

    public function ech(){ echo "food"; }

    }

    ⊙类名不区分大小写,类名支持可变类名,实例化时类名可以是变量

    $name='tom'; $stud= new $name;

  ⊙实例化new

    实例化:依据类结构,制作对象的过程。

  $s = new student;

  !!先声明类,在实例化

  先实例化没报错是因为:计算机识别php语言要先预处理编译。

  ⊙操作对象->

    访问成员,利用->语法   $对象名->属性或方法

    !!利用函数property_exists()判断属性是否存在

      isset函数在当属性值为null值时,会判断false;

      var_dump(isset($stud->name));

      property_exists($stud,"name");

    支持可变变属性

    $name='tom'; $stud->$name;

  ⊙局部变量$this 用于保存当前对象的引用,谁调用方法谁就是当前对象

  ⊙局部变量self::永远代表其所在类

    Parent::  父类

  ⊙对象的比较,同一个类并且属性相同则相等,同一个类标识一致才全等

  ⊙instanceof运算符,判断对象是否为某个类的实例(对象)

    var_durp(实例化对象名 instanceof 类名);

●构造方法__construct()

  构造方法:在对象被实例化的过程中,被自动调用的方法,

  作用于对对象进行初始化工作。

  实例化时,可以为构造方法传参。

  public function __construct($n,$y){$this->name=$n;$this->pwd=$y;}

  实例化传参 $s = new Student("pwd123","123456");

●析构方法__destruct()

  在对象被销毁过程中,被自动化调用的方法,称为析构方法。

  1)将对象数据持久化

    public function start(){echo"死循环";}

    public function __destruct(){$this->start();};

  2)释放对象占用的额外资源,如mysql的链接资源

  unset(对象);

  public function __destruct(){mysql_close($this->link);}

●访问修饰限定符

  用于限定成员属性、方法在哪里可以访问的关键字public,protected,private

  public公共的      protected保护的    private私有的

  !!基于成员访问位置与成员定义位置,php代码分为三个区域

  1)本类类,访问位置与定义位置,处于同一类

  2)继承链内,访问位置在定义位置的子类或父类

    !!私有成员不能被重写,可以被继承,

    导致的语法结果,在那个类中访问到的是哪个类中定义的成员。

  3)类外。除了本类内,与继承链上类内都属于类外。

  ⊙public公共的  成员可以在类、类外、继承链都可以访问

  ⊙protected保护的   类中吗,与继承链上可以访问

  ⊙private私有的   只有本类中可以访问

●对象的克隆clone

  通过已有对象,得到一个属性一致的新对象

  新对象=clone 旧对象;

  克隆后将会对新对象某些属性加以处理,区分克隆后的版本

  ⊙__clone()方法,用于在克隆时自动被执行,用于完成新对象某些属性的初始化

    public function __clone(){$this->alpha=50;}//$this 是克隆后的对象

●类常量const

  属于类的常量,称为类常量。将常量数据与某个类关联起来。

  ⊙常量的声明:   const 常量名 = 值;

  类常量不受访问修饰的控制,不需要使用public等关键字。

  const,关键字可以用于声明普通常量,但在类中需要为常量设定

  固定值,因为const是预处理,在语法编译时需要确定的值。

  ⊙访问:类名::常量名  

  Goods::CL; 类里面用self::常量名称

  !!⊙  ::称为范围解析操作符。

  ⊙类常量的作用

  1)在语法层面上限制数据不能被改变

  2)说明作用,便于理解。const sex1=1;  Goods::sex1;


●静态变量static

  被static修饰的成员属性和方法,保存在静态内存区。static $变量名

  在类外调用:  类名称::被static修饰的成员或方法

  在类里调用:  self::被static修饰的成员或方法

  !!  $this 关键字不能出现在静态成化成员方法中,静态化成员方法不能访问

      非静态化的成员方法和成员属性


●继承extends

  定义:如果一个对象A,使用了对象B的成员,称为A对象继承自B对象。

  语法:class A extends B{需要继承的属性}

  例:商品出售,手机与书本都有公用属性名字跟价格

  class Goods{

  public $name;

  public $price;

  public function fun(){echo "string"}

  }

  class Phone extends Goods{

  public $color;

  public $mode;//型号

  }

  class Book extends Goods{

  public $writer;//作者

  public $publisher;//出版社

  }

$p = new Phone;

  继承在语法上体现了oop中语法的重用。

  echo $p->fun();

  !!继承不是将父类中的代码复制到子类中,而是在两个类中建立了联系。

  ⊙单继承

    一个类只能存在一个父类,但一个类可以被多个类继承。

●重写override

  当子类成员名字与父类发生冲突时,子类访问的成员是子类自己的成员。

  作用:允许多个子类中出现的一些特例情况,不同于父类的属性值。

  !!如果要强制执行被重写的父类:

  使用parent关键字,parent表示父类的意思,格式parent::

  例如常见的构造、析构、克隆、名字固定方法:

  class Phone{

  public $color; public $mode;

  public function __construct($color,$mode);

  parent::__constrct($name,$price);

  $this->color=$color;  $this->mode=$mode;

  }

  parent,self的区别:parent::父类,self::子类;

●魔术方法

  ⊙__toString()

  在以字符串形式输出类对象时,魔术方法__toString()会被自动调用。

  在__toString()要return一个字符串。return的字符串可以作为对当前类的说明。


  ⊙__call()

  在访问类中不存在的成员方法时,魔术方法__call()会被自动调用。

  魔术方法__call()需要两个参数。第一参数是访问的不存在的成员方法的名称。第二个参数是访问不存在的成员方法的参数。第二个参数格式是数组。将多个功能相似的成员方法写入到__call()。


  ⊙autoload()

    在类被实例化时会被自动访问,autoload魔术方法必须要求一个参数

    作用:自动

    function __autoload($classname){

      include $classname.".php";

    }

    $p = new Mobile;

    //通过映射方法获得类

    function __autoload($classname){

      $class = array('Book'=>'../common/Book.class.php');

      $class = array('Goods'=>'./Goods.class.php');

      $class = array('Phone'=>'./Phone.class.php');

      require $class['$classname'];

    }

    //规律推导:适合扩展,

    if(substr($classname,0,5)=='commo'){

      require "./commo/".class.php;

    }


●单例模式(单件模式)

  保证类对象被实例化一次。

  1、将构造方法私有化,这样类就不能在类外被实例化

  2、定义一个成员方法,在成员方法中实例化当前类。

  3、将成员方法定义为静态。在成员方法中返回类对象。

  4、定义一个静态化的变量,设初始值为null,每次实例化之前,判断静态化的变量是否为null, 仅仅在静态化的变量为null时,初始化类对象。


  用途:

  防止多次实例化类对象,内存被多次分配,减少内存浪费。



●final

   - 被final修饰的类不能被继承。

   - 被final修饰的成员方法不能被重载。

   - final不能用来修饰成员属性。

   其作用:限制子类中必须存在,而且实现是相同的功能。

●abstract抽象类:仅仅可以被继承,不能被实例化

  abstract class 类名

  抽象方法:  abstract public function Bool();

  如果一个方法为抽象方法,指的是:仅仅存在方法的声明

  部分(方法名,方法参数),而没有方法的实现部分(方法体)的方法

  !!如果一个类中,包含了抽象方法,那么该类必须被声明为抽象类。

  作用:要求继承包含抽象方法的抽象类的子类,必须将抽象方法重写实现。

        除非,将子类定义成抽象类。

  作用:可以在类中限制子类中必须存在,但是可以实现不同的方法


●接口  interface 

  接口技术:用于限定对象应该具有的公共接口方法的一种技术。

  interface 接口名称{

    //接口中不能有普通的成员方法和成员属性。仅能有常量和抽象方法。

    function getdata();

  }

  在接口中的抽象方法不能出现关键字 abstract.

  - 接口同样不能被实例化。用来定义规范。接口在项目中是用来被继承的。

   类对于接口的继承:implements

   接口对于接口的继承:extends

  - 类继承接口,则必须重载接口中的全部抽象方法。

  - 一个类可以同时继承一个抽象类和多个接口。


●●●PDO

  PDO提供了抽象层数据操作的类。通过这个类可以对数据库进行操作。

  打开extension=php_pdo_mysql.dll

应用 PDO(string $dsn,string $username,string $password) 

   $dsn = "数据库类型,数据库地址,数据库名称";

   $dsn = "mysql:host=localhost;dbname=itcast";

   $pdo = new PDO($dsn,"root","root");

⊙exec(string $query); 对与没有返回结果集的sql语句进行操作,返回被影响行数,false

⊙lastInsertId()返回最近一次成功插入数据的id,要求id是自增涨。

⊙query(string $query)对于有结果集的sql语句进行操作

●PDO的准备语句

  ⊙1)编译prepare(string $query); 只编译,不执行。返回是PDOStament类对象 

    $s = $pdo->prepare($query);

  ⊙2)绑定 bindparam(string $key,string  $value);

    $s->bindParam(":name",$name);

  ⊙3)执行  execute()   PDOStament类对象通知mysql执行sql语句

  ⊙4)fetch([int $fetch_style])

        功能:获取查询结果。

        参数:

        fetch_style PDO::FETCH_BOTH 获取的结果格式是关联数组和索引数组。

                    PDO::FETCH_ASSOC 获取的结果格式是关联数组。

                    PDO::FETCH_NUM   获取的结果格式是索引数组。

        返回:获取一行查询结果。当获取不到时返回false。

      $result = $statm->execute();

      print_r($statm->fetch(PDO::FETCH_BOTH));

  ⊙5)获取被影响的行数

        rowCount()

        功能:获取 insert、update、delete、select被影响行数

        返回:被影响的行数 

        echo $statm->rowcount();

===============

PDO中完成事务处理

$dsn = "mysql:host=localhost;dbname=itcast";

$pdo = new PDO($dsn,"root","root");

//关闭自动提交

$pdo->setattribute(PDO::ATTR_AUTOCOMMIT,0);

//开启事务

$pdo->beginTransaction();

//

$sql = "update bbb set age=age-10 where id=1";

$result1 = $pdo->exec($sql);

$sql = "update bbb set age=age+10 where id=2";

$result2 = $pdo->exec($sql);

if($result1 && $result2){

  echo "成功";

}else{echo "失败";}

// 开启自动提交

$pdo->setattribute(PDO::ATTR_AUTOCOMMIT,1);



==================

单利模式

//6、定义Single类,对该类实现单例模式。

class Single{

static $obj = null;

//禁止类在类外被实例化,构造方法私有化

private function __construct(){

}

//在类里实例化类获取类对象

static function getObj(){

/*

* 判断静态化成员属性obj是否为空

* 若为空则进行实例化,并把实例化后的结果

* 负值给静态化成员属性obj,此时

* 静态化成员属性obj不为空,里面存储着类对象

* 若不为空,则不进行实例化,直接将

* 静态化成员属性obj里面装的类对象直接返回

*/

if(is_null(self::$obj)){

//此时 self::$obj 存储Single类的类对象

self::$obj = new Single;

}

return self::$obj;

}

}

//在类外对成员方法的访问:

//类对象->成员方法

//类名称::成员方法

$s = Single::getObj();


$s1 = Single::getObj();



关注博客,更多精彩分享,敬请期待!
 

Tags:

很赞哦! (0)

上一篇:什么是面向对象

下一篇:单例模式

我的名片

网名:随心

职业:PHP程序员

现居:湖北省-武汉市

Email:704061912@qq.com