面向对象
对象的概念是面向对象技术的核心。在现实世界里,我们面
对的所有事物都是对象,如计算机、电视机、自行车等在面向
对象的程序设计中,对象是一个由信息及对信息进行处理的描
述所组成的整体,是对现实世界的抽象。
面向对象的三个主要特性:
对象的行为:可以对对象施加哪些操作;如电视机的开、关、转换频道等。
对象的状态:当施加那些方法时,对象如何响应;如电视机的外形、尺寸、颜色等;
对象的标识:如何区分具有相同行为与状态的不同对象。
类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对对象的抽象就是类.类描述了一组有相同特性 (属性)和相同行为(方法)的对象。
什么是类:
具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也以说类的实例是对象,类实际上就是一种数据类型。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
什么是对象:
在客观世界里,所有的事务都是由对象和对象之间的联系组成的。对象是系统中用来描述客观事物的一个实体,他是构成系统的一个基本单位
简单格式:
[修饰符] class 类名 //使用class关键字加空格后加上类名
{
[成员属性] //也叫成员变量
[成员方法] //也叫成员函数
}
完整格式:
[修饰符] class 类名 [extends 父类] [implements 接口1[,接口 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
成员方法格式:
[修饰符] function 方法名(参数..)
{
[方法体]
[return 返回值]
}
修饰符:public、protected、private、static、abstract、final
声明的成员方法必须和对象相关,不能是一些没有意义的操作
//下面声明了几个人的成员方法,通常将成员方法声明在成员属性的下面
public function say(){ //人可以说话的方法
echo "人在说话"; //方法体
}
public function run(){ //人可以走路的方法
echo "人在走路"; //方法体
}
当定义好类后,我们使用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"
}
对象和类的关系:
对象是实际存在的,占有动态资源。
类是对象的蓝图,可能占有静态资源。
对象属性占有动态资源
类(静态)属性实际上是有类名字空间上的“全局变量”
性能考虑:
每个对象要单独占用数据空间
增加的调用层次可能消耗执行时间
类中包含成员属性与成员方法两个部分,我们可以使用“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
特殊对象的引用$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
构造函数:
大多数类都有一种称为构造函数的特殊方法。当创建一个对象
时,它将自动调用构造函数,通常用它执行一些有用的初始化
任务。
构造函数的声明与其它操作的声明一样,只是其名称必须是两
个下划线__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 "\n再见".$this->name."<br>";
}
只要在声明成员属性或成员方法时,使用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
私有方法是无法在外部设置的
<?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();
?>
魔术方法:
__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
异常(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()."\n";
//输出捕获的异常消息
}
echo ‘Hello World‘; //程序没有崩溃继续向下执行
系统自带异常处理
捕获多个异常
在try代码之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块关联使用。那么使用多个catch就可以捕获不同的类所产生的异常。注意顺序。
PDO(php data object)扩展类库为php访问数据库定义了轻量级的、一致性的接口,它提供了一个数据库访问抽象层,这样,无论你使用什么数据库,都可以通过一致的函数执行查询和获取数据,大大简化了数据库的捉拿和,并能够屏蔽不同数据库之间的差异,使用pdo可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,是将来php在数据库处理方面的主要发展方向,它可以支持mysql,postgresql,oracle,mssql等多种数据库
以多种方式调用构造方法
$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 "\nPDO是否关闭自动提交功能:". $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo "\n当前PDO的错误处理的模式:". $pdo->getAttribute(PDO::ATTR_ERRMODE);
echo "\n表字段字符的大小写转换: ". $pdo->getAttribute(PDO::ATTR_CASE);
echo "\n与连接状态相关特有信息: ". $pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS);
echo "\n空字符串转换为SQL的null:". $pdo->getAttribute(PDO::ATTR_ORACLE_NULLS);
echo "\n应用程序提前获取数据大小:".$pdo->getAttribute(PDO::ATTR_PERSISTENT);
echo "\n与数据库特有的服务器信息:".$pdo->getAttribute(PDO::ATTR_SERVER_INFO);
echo "\n数据库服务器版本号信息:". $pdo->getAttribute(PDO::ATTR_SERVER_VERSION);
echo "\n数据库客户端版本号信息:". $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION);
PDO连接设置字符集
设置php连接mysql时的客户端字符串和连接字符串集为:
$pdo->exec(“set names utf8”);
或者:
$pdo->query(“set names utf8”);
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