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);
原文地址:https://www.cnblogs.com/yicunyiye/p/13751079.html