zoukankan      html  css  js  c++  java
  • php第十天-面向对象命名空间

    0x01 面向对象的介绍

    1.1什么是面向对象

    面向对象
    对象的概念是面向对象技术的核心。在现实世界里,我们面
    对的所有事物都是对象,如计算机、电视机、自行车等在面向
    对象的程序设计中,对象是一个由信息及对信息进行处理的描
    述所组成的整体,是对现实世界的抽象。
    面向对象的三个主要特性:
    对象的行为:可以对对象施加哪些操作;如电视机的开、关、转换频道等。
    对象的状态:当施加那些方法时,对象如何响应;如电视机的外形、尺寸、颜色等;
    对象的标识:如何区分具有相同行为与状态的不同对象。

    1.2 类和对象之间的关系

    类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对对象的抽象就是类.类描述了一组有相同特性 (属性)和相同行为(方法)的对象。

    什么是类:
    具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也以说类的实例是对象,类实际上就是一种数据类型。
    类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
    类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

    什么是对象:
    在客观世界里,所有的事务都是由对象和对象之间的联系组成的。对象是系统中用来描述客观事物的一个实体,他是构成系统的一个基本单位

    0x02 如何抽象一个类

    2.1类的声明

    简单格式:
    [修饰符] class 类名 //使用class关键字加空格后加上类名
    {
    [成员属性] //也叫成员变量
    [成员方法] //也叫成员函数
    }
    完整格式:
    [修饰符] class 类名 [extends 父类] [implements 接口1[,接口 2...]]
    {
    [成员属性] //也叫成员变量
    [成员方法] //也叫成员函数
    }

    2.2成员属性

    格式:
    修饰符 $变量名[=默认值]; //如:public $name="zhangsan";
    注意:成员属性不可以是带运算符的表达式、变量、方法或函数调用
    常用属性修饰符:public、protected、private、static、var(过时)

    <?php
    class Index
    {
    	public $name = 'zhangsan';
    	public function test(){
    		echo 1;
    	}
    }
    
    $info = new Index();
    echo "<pre>";
    var_dump($info);
    ?>
    

    输出

    object(Index)#1 (1) {
      ["name"]=>
      string(8) "zhangsan"
    }
    

    也可以直接取

    var_dump($info->name);
    

    输出

    string(8) "zhangsan"
    

    如果我们要调用test方法

    $info->test();
    

    输出1

    2.3 成员方法

    成员方法格式:
    [修饰符] function 方法名(参数..)
    {
    [方法体]
    [return 返回值]
    }
    修饰符:public、protected、private、static、abstract、final
    声明的成员方法必须和对象相关,不能是一些没有意义的操作

            //下面声明了几个人的成员方法,通常将成员方法声明在成员属性的下面
           public function say(){    //人可以说话的方法
                echo "人在说话";        //方法体
            }       
           public function run(){     //人可以走路的方法
                echo "人在走路";        //方法体
            }
    
    

    0x03 通过类实例化对象

    3.1实例化对象

    当定义好类后,我们使用new关键字来生成一个对象。
    $对象名称 = new 类名称();
    $对象名称 = new 类名称([参数列表]);
    由于对象资料封装的特性,对象属性(类中定义的变量)是无法由主程序区块直接来访问的,必须通过对象来调用类中所定义的属性和行为函数,间接地达成存取控制类中资料的目的。

    <?php
    class Index
    {
    	public $name = 'zhangsan';
    	public $config_name='';
    	public function __construct($name='',$config_name='lisi'){
    		$this->name=$name;
    		$this->config_name=$config_name;
    	}
    }
    
    $info = new Index('zhangsan');
    echo "<pre>";
    var_dump($info);
    ?>
    

    输出

    object(Index)#1 (2) {
      ["name"]=>
      string(8) "zhangsan"
      ["config_name"]=>
      string(4) "lisi"
    }
    

    3.2对象类型在内存中的分配

    对象和类的关系:
    对象是实际存在的,占有动态资源。
    类是对象的蓝图,可能占有静态资源。
    对象属性占有动态资源
    类(静态)属性实际上是有类名字空间上的“全局变量”
    性能考虑:
    每个对象要单独占用数据空间
    增加的调用层次可能消耗执行时间

    3.3对象中成员的访问

    类中包含成员属性与成员方法两个部分,我们可以使用“new”关键字来创建一个对象,即:$引用名 = new 类名(构造参数);那么我们可以使用特殊运算符“->”来访问对象中的成员属性或成员方法。如:
    $引用名 = new 类名(构造参数);
    $引用名->成员属性=赋值; //对象属性赋值
    echo $引用名->成员属性; //输出对象的属性
    $引用名->成员方法(参数);//调用对象的方法
    如果对象中的成员不是静态的,那么这是唯一的访问方式。

    <?php
    class Index
    {
    	public $config_name='';
    	public function __construct($name='',$config_name='lisi'){
    		$this->name=$name;
    		$this->config_name=$config_name;
    	}
    }
    
    $info = new Index;
    $info->name='wangwu';
    echo $info->name;
    echo "<pre>";
    // var_dump($info);
    ?>
    

    输出wangwu

    3.4特殊的对象引用"$this"

    特殊对象的引用$this就是在对象内部的成员方法中,代表本对象的一个引用,但只能在对象的成员方法中使用,不管是在对象内部使用$this访问自己对象内部成员。还是在对象外部通过对象的引用名称访问对象中的成员,都需要使用特殊的运算符“->”来完成访问

    <?php
    class Index
    {
    	public $name = 'zhangsan';
    	public function test(){
    		echo $name;
    	}
    }
    
    $info = new Index;
    echo "<pre>";
    $info->test();
    
    ?>
    

    输出空

    <?php
    class Index
    {
    	public $name = 'zhangsan';
    	public function test(){
    		echo $this->name;
    	}
    }
    
    $info = new Index;
    echo "<pre>";
    $info->test();
    
    ?>
    

    输出zhangsan

    3.5构造方法与析构方法

    构造函数:
    大多数类都有一种称为构造函数的特殊方法。当创建一个对象
    时,它将自动调用构造函数,通常用它执行一些有用的初始化
    任务。
    构造函数的声明与其它操作的声明一样,只是其名称必须是两
    个下划线__construct( )。这是PHP5中的变化;PHP4的版本中,
    构造函数的名称必须与类名相同。为了向下兼容,如果一个类
    中没有名为__construct( )的方法,PHP将搜索一个与类名相
    同的方法。
      格式: [修饰符] function __construct ( [参数] ) {
    ... ...
    }

    <?php
    class Index
    {
    	public $config_name='';
    	public $name = 'zhangsan';
    	public function __construct($name='',$config_name=''){
    		if($name == '123'){
    			$this->name=$name;
    		}
    	}
    	public function test(){
    		// echo 1;
    		echo $this->name;
    	}
    }
    
    $info = new Index();
    echo "<pre>";
    $info->test();
    

    输出zangsan

    $info = new Index('123');
    

    输出123

    析构函数:
    与构造函数相对的就是析构函数。析构函数是PHP5新添加的内容,在PHP4中没有析构函数。析构函数是在对象被销毁之前自动调用的方法,主要执行一些特定的操作,例如关闭文件,释放结果集等。
    与构造函数的名称类似,一个类的析构函数名称必须是两个下划线 _ _destruct( )。析构函数不能带有任何参数

    public function __destruct(){
    		echo "
    再见".$this->name."<br>";
    	}
    

    0x04 封装性

    4.1 设置私用成员

    只要在声明成员属性或成员方法时,使用private关键字修饰就是实现了对成员的私有封装。封装后的成员在对象的外部不能直接访问,只能在对象的内部方法中使用 $this访问

    class Index
    {
    	public $config_name='';
    	private $name = 'zhangsan';
    
    	public function test(){
    		echo $this->name;
    	}
    
    }
    $info = new Index();
    echo "<pre>";
    $info->test();
    $info->name='123';
    

    输出报错Fatal error: Uncaught Error: Cannot access private property Index::$name
    私有方法是无法在外部设置的

    4.2私有成员的访问

    <?php
    class Person{                 
    private $name;            //第一个成员属性$name定义人的名字,此属性被封装
    private $sex;               //第二个成员属性$sex定义人的性别,此属性被封装
    	
    public  function setName($name) {  //通过此方法设置属性name的值
    	 $this->name=$name;                 //为对象的私有属性赋值
    }
    public function getName(){            //通过此方法获取属性name的值
    	 return $this->name;              //返回当前的私有名字属性
    }        
    public function setSex($sex) {       //通过此方法设置属性sex的值
    	if($sex=="男" || $sex=="女")   //如果传入合法的值才为私有的属性赋值
        	 $this->sex=$sex;             //条件成立则将参数传入的值赋给私有属性
    	}
    public function getSex(){               //通过此方法获取属性$sex的值
    	  return $this->sex;               //返回当前的私有性别属性
    }
    }
    
    
    
    $info = new Person();
    $info->setName("zangsan");
    $info->setSex("男");
    echo $info->getName();
    echo $info->getSex();
    ?>
    

    4.3 __set()__get()__isset()和__unset()

    魔术方法:
    __set(): 用于替代通用的set赋值方法
    __get(): 用于替代通用的get取值方法
    __isset(): 检测对象中成员属性是否存在
    __unset(): 销毁对象中成员属性方法
    注意:
    上面四个魔术方法只对类中的私有、受保护成员属性有效。
    魔术方法前的修饰符可以是公有、私有,不影响调用。

    __set( )方法:
    格式 [修饰符] function __set(string $name,mixed $value){
    ... }
    当我们直接为一个对象中非公有属性赋值时会自动调用此方法,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此方法中。
    __get( )方法:
    格式:[修饰符] function __get(string $name){ ... }
    当我们直接输出一个对象中非公有属性时会自动调用此方法,并将属性名以第一个参数传进去

    <?php
    class Index{
    	private $name;
    	private $config_name;
    	public function __set($name,$value){
    		$this->$name=$value;
    	}
    }
    
    $info = new Index();
    $info->name="123";
    $info->config_name="123";
    var_dump($info);
    ?>
    

    输出

    object(Index)#1 (2) { ["name":"Index":private]=> string(3) "123" ["config_name":"Index":private]=> string(3) "123" }
    

    但是我们通过var_dump($info->name);取获取它就报错了Fatal error: Uncaught Error: Cannot access private property Index::$name in
    我们就可以通过魔术方法__get()来获取它

    <?php
    class Index{
    	private $name;
    	private $config_name;
    	public function __set($name,$value){
    		$this->$name=$value;
    	}
    
    	public function __get($name){
    		echo $this->$name;
    	}
    }
    
    $info = new Index();
    $info->name="123";
    $info->config_name="123";
    $info->name;
    $info->config_name;
    ?>
    

    输出123123

    __isset( )方法:
    格式: [修饰符] function __isset(string $name){ ... }
    当使用isset()或empty()判断一个对象的私有或受保护的属性是否存在时,会自动调用此方法。参数name表示被判断的属性名。
    __unset( )方法:
    格式: [修饰符] function __unset(string $name){ ... }
    当使用unset( )销毁一个对象的私有或受保护的属性时,自动调用此方法,并将属性名以第一个参数传进去。

    <?php
    class Index{
    	private $name;
    	private $config_name;
    	public function __set($name,$value){
    		$this->$name=$value;
    	}
    
    	public function __get($name){
    		echo $this->$name;
    	}
    
    	public function __isset($name){
    		return isset($this->$name);
    	}
    
    	public function __unset($name){
    		if($name == "name")
    			return;
    		unset($this->$name);
    	}
    }
    
    $info = new Index();
    $info->name="123";
    $info->config_name="123";
    // $info->name;
    // $info->config_name;
    var_dump(isset($info->name));
    ?>
    

    输出bool(true)

    public $sex;
    echo "<pre>";
    unset($info->sex);
    var_dump($info);
    
    

    删除sex

    0x05 异常处理

    异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程。是PHP5中的一个新的重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。
    异常处理格式:
    try{
    使用try去包含可能会发生异常的代码.
    一旦出现异常try进行捕获异常,交给catch处理。
    抛出异常语句:throw 异常对象。
    }catch(异常对象参数){
    在这里做异常处理。
    }[catch(。,,){
    .. .. ..
    }]
    一个简单异常处理实例

    <?php
    	try {
    		$error = 'Always throw this error';
    		throw new Exception($error);   
    		//创建一个异常对象,通过throw语句抛出
    		echo 'Never executed';         
    		//从这里开始,try代码块内的代码将不会再被执行
    	} catch (Exception $e) {
    		echo ‘Caught exception: ’.$e->getMessage()."
    ";  
    		//输出捕获的异常消息
    	}
    	echo 'Hello World';       //程序没有崩溃继续向下执行
    
    

    系统自带异常处理

    捕获多个异常
    在try代码之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块关联使用。那么使用多个catch就可以捕获不同的类所产生的异常。注意顺序。

    0x06 PHP中类与对象的相关函数

    1. class_exists — 检查类是否已定义
      格式: bool class_exists ( string $class_name [, bool $autoload ] )
      --如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE。
      默认将会尝试调用 __autoload,如果不想让 class_exists() 调用 __autoload,可以将 autoload 参数设为 FALSE。
    2. get_class_methods — 返回由类的方法名组成的数组
      格式:array get_class_methods ( mixed $class_name )
      返回由 class_name 指定的类中定义的方法名所组成的数组。如果出错,则返回 NULL。
      从 PHP 4.0.6 开始,可以指定对象本身来代替 class_name
    3. get_class — 返回对象的类名
      格式: string get_class ([ object $obj ] )
      返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE。
    4. get_object_vars — 返回由对象属性组成的关联数组
      格式:array get_object_vars ( object $obj )
      返回由 obj 指定的对象中定义的属性组成的关联数组。
    5. get_parent_class — 返回对象或类的父类名
      格式:string get_parent_class ([ mixed $obj ] )
      如果 obj 是对象,则返回对象实例 obj 所属类的父类名。
    6. is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE
      格式:bool is_a ( object $object , string $class_name )
      我们可以使用运算符: instanceof代替上面的is_a操作
    7. method_exists — 检查类的方法是否存在
      格式:bool method_exists ( object $object , string $method_name )
      如果 method_name 所指的方法在 object 所指的对象类中已定义,则返回 TRUE,否则返回 FALSE。
    8. property_exists — 检查对象或类是否具有该属性
      格式:bool property_exists ( mixed $class , string $property )
      本函数检查给出的 property 是否存在于指定的类中(以及是否能在当前范围内访问)。

    0x07 PDO

    7,1 PDO作用

    PDO(php data object)扩展类库为php访问数据库定义了轻量级的、一致性的接口,它提供了一个数据库访问抽象层,这样,无论你使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据库的捉拿和,并能够屏蔽不同数据库之间的差异,使用pdo可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,是将来php在数据库处理方面的主要发展方向,它可以支持mysql,postgresql,oracle,mssql等多种数据库

    7.2 PDO的安装

    1. 编辑php.ini文件:
      extension=php_pdo.dll
      extension=php_pdo_mysql.dll
      2.重启apache服务:
      httpd –k restart
      3.打开phpinfo.php查看是否有pdo

    7.3 创建PDO对象

    以多种方式调用构造方法

    
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1'; //连接MySQL数据库的DSN 
    $user = 'root'; //MySQL数据库的用户名
    $password = 'root'; //MySQL数据库的密码
    try { 
         $dbh = new PDO($dsn, $user, $password); 
    } catch (PDOException $e) { 
          echo '数据库连接失败: ' . $e->getMessage(); 
    }
    
    /*连接如果失败,使用异常处理模式进行捕获 */
    try{
         $dbh = new PDO("OCI:dbname=accounts;charset=UTF-8", "scott", "tiger"); 
    }catch(PDOException $e) { 
         echo "数据库连接失败: " .$e->getMessage();
    }
    
    
    try { 
          $dbh = new PDO('uri:file:///usr/local/dbconnect', 'webuser', 'password'); 
    } catch (PDOException $e) { 
           echo '连接失败: ' . $e->getMessage(); 
    }
    
    
    try { 
          //使用php.ini文件中的oraclepdo别名 
          $dbh = new PDO("oraclepdo", "scott", "tiger");  
    } catch (PDOException $e) { 
          echo "数据库连接失败: " .$e->getMessage();
    }
    
    
    //设置持久连接的选项数组作为最后一个参数,可以一起设置多个元素 
    $opt = array(PDO::ATTR_PERSISTENT => true);   
    try { 
           $db = new PDO('mysql:host=localhost;dbname=test','dbuser','passwrod',$opt); 
    } catch (PDOException $e) { 
           echo "数据库连接失败: " .$e->getMessage(); 
    }
    
    

    PDO与连接有关的选项
    PDO::ATTR_ERRMODE
    1.PDO::ERRMODE_SILENT 0
    2.PDO::ERRMODE_WARNING 1
    3.PDO::ERRMODE_EXCEPTION 2
    PDO::ATTR_AUTOCOMMIT
    1.0 //关闭自动提交
    2.1 //开启自动提交
    PDO::ATTR_DEFAULT_FETCH_MODE
    1.PDO::FETCH_ASSOC 2
    2.PDO::FETCH_NUM 3
    3.PDO::FETCH_BOTH 4
    4.PDO::FETCH_OBJ 5

    PDO连接属性设置实例

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //$pdo->setAttribute(3,2); 
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//$pdo->setAttribute(0,0); 
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    //$pdo->setAttribute(19,2); 
    
    echo "
    PDO是否关闭自动提交功能:". $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
    echo "
    当前PDO的错误处理的模式:". $pdo->getAttribute(PDO::ATTR_ERRMODE); 
    echo "
    表字段字符的大小写转换: ". $pdo->getAttribute(PDO::ATTR_CASE); 
    echo "
    与连接状态相关特有信息: ". $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS); 
    echo "
    空字符串转换为SQL的null:". $pdo->getAttribute(PDO::ATTR_ORACLE_NULLS); 
    echo "
    应用程序提前获取数据大小:".$pdo->getAttribute(PDO::ATTR_PERSISTENT); 
    echo "
    与数据库特有的服务器信息:".$pdo->getAttribute(PDO::ATTR_SERVER_INFO); 
    echo "
    数据库服务器版本号信息:". $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
    echo "
    数据库客户端版本号信息:". $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION); 
    

    PDO连接设置字符集
    设置php连接mysql时的客户端字符串和连接字符串集为:
    $pdo->exec(“set names utf8”);
    或者:
    $pdo->query(“set names utf8”);

    7.4PDO对象中的成员方法

    1. query($sql); 用于执行查询SQL语句。返回PDOStatement对象
    2. exec($sql); 用于执行增、删、改操作,返回影响行数;
    3. getAttribute(); 获取一个"数据库连接对象"属性。
    4. setAttribute(); 设置一个"数据库连接对象"属性。
    5. beginTransaction 开启一个事物(做一个回滚点)
    6. commit 提交事务
    7. rollBack 事务回滚操作。
    8. errorCode 获取错误码
    9. errorInfo 获取错误信息
      10.lastInsertId 获取刚刚添加的主键值。
      11.prepare 创建SQL的预处理,返回PDOStatement对象
      12.quote 为sql字串添加单引号。

    pdo::exec()方法
    当执行insert,update,delete没有结果集的查询时,使用pdo对象中的exec()方法去执行,该方法成功执行时,将返回受影响的行数,注意,该方法不能用于select查询,
    pdo::query()方法
    当执行返回结果集的select查询时,或者所影响的行数无关紧要时,应当使用pdo对象中的query()方法,如果该方法成功执行指定的查询,则返回一个pdostatement对象,如果使用了query()方法,并想了解获取数据行总数,可以使用pdostament对象中的rowCount()方法获取,

    $dbh = new PDO('mysql:dbname=testdb;host=localhost', 'mysql_user', 'mysql_pwd'); 
    $stmt = $dbh->prepare("SELECT contenttype, imagedata FROM images WHERE id=1"); 
    $stmt->execute($stmt); 
    var_dump($stmt);
    
  • 相关阅读:
    World Wide Web Publishing Service 服务成功发送一个 停止 控件
    绵竹网站整理
    利用AirPlayer空中播放PC服务器视频、音乐、图片
    ic管理系统
    IIS 6.0下访问aspx文件提示无法找到该页
    GHOST XP SP3无法安装IIS的解决办法
    html 整个页面变灰
    爱普生LQ630K 730K如何换色带
    sql 格式 00123
    serveu 错误1069 由于登陆失败而无法启动服务
  • 原文地址:https://www.cnblogs.com/yicunyiye/p/13751079.html
Copyright © 2011-2022 走看看