猎取单个对象
要从查询效果建立单个对象,有两种要领。
1.运用熟习的fetch()要领:
class User {}; $stmt = $pdo->query('SELECT name FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_CLASS, 'User'); $user = $stmt->fetch();
2.专用的fetchObject()要领:
class User {}; $user = $pdo->query('SELECT name FROM users LIMIT 1')->fetchObject('User');
虽然这两个代码段都将为你供应雷同的User类实例,
/* object(User)#3 (1) { ["name"] => string(4) "John" } */
后一种要领看起来相对更简约。另外,假如运用了fetch()要领,然则没有运用如许的称号定义类,则将寂静返回一个数组,而运用fetchObject()将抛出一个恰当的毛病。
猎取对象数组
固然,上面形貌的两种要领都能够与一个熟习的while语句一同运用,从数据库中猎取效果行。
运用一个轻易的fetchAll()要领一次猎取对象数组中一切返回的纪录:
class User {}; $users = $pdo->query('SELECT name FROM users')->fetchAll(PDO::FETCH_CLASS, 'User');
将给你一个数组,由一个User类的对象构成,返回数据添补属性:
/* array(2) { [0]=> object(User)#3 (1) { ["name"] => string(4) "John" } [1]=> object(User)#4 (1) { ["name"]=> string(4) "Mike" } } */
注重,你能够将此情势与PDO::FETCH_UNIQUE和PDO::FETCH_GROUP组合运用,以取得由唯一字段索引的效果数组,或许离别运用非唯一字段对效果举行分组。
比方,下面的代码将返回一个数组,个中纪录id将用作数组索引而不是一连数字。
class User {}; $stmt = $pdo->query('SELECT id, id, name, car FROM users'); $users = ->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_UNIQUE, 'User');
分派类属性
不管挑选哪一种要领,查询返回的一切列都将根据以下划定规矩分派给对应的类属性:
1.假如有一个类属性,它的称号与列名雷同,则将为该属性分派列值
2.假如没有如许的属性,那末将挪用一个把戏要领__set()
3.假如没有为该类定义__set()要领,那末将建立一个大众属性并为其分派一个列值。
比方,这段代码
class User { public $name; } $user = $pdo->query('SELECT * FROM users LIMIT 1')->fetchObject('User');
将给你一个对象,一切属性自动分派,不管它们是不是存在于类中:
/* object(User)#3 (4) { ["id"] => string(3) "104" ["name"] => string(4) "John" ["sex"] => string(4) "male" ["car"] => string(6) "Toyota" } */
从这一点能够看出,为了防止自动建立属性,你能够运用把戏要领__set()过滤掉属性。最简朴的过滤手艺就是一个空的__set()要领。运用它,只会设置现有的属性:
class User { private $name; public function __set($name, $value) {} } $user = $pdo->query('SELECT * FROM users LIMIT 1')->fetchObject('User'); /* array(1) { [0]=> object(User)#3 (1) { ["name":"User":private]=> string(4) "John" } } */
如上PDO还能够为私有属性分派值。
将组织函数参数通报给对象
固然,关于新建立的对象,我们能够须要供应组织函数参数。为此,fetchObject()和fetchAll()要领都有一个专用的参数,你能够运用它以数组的情势通报组织函数参数。
假定我们有一个类User,它有一个car属性,能够经由过程供应的变量在组织函数中设置:
class User { public function __construct($car) { $this->car = $car; } }
在猎取纪录时,我们应当增加一个带有组织函数参数的数组:
$users = $pdo->query('SELECT name FROM users LIMIT 1') ->fetchAll(PDO::FETCH_CLASS, 'User', ['Caterpillar']); $user = $pdo->query('SELECT name FROM users LIMIT 1') ->fetchObject('User',['Caterpillar']);
/* object(User)#3 (2) { ["name"] => string(4) "John" ["car"] => string(11) "Caterpillar" } */
能够看到,数据库中的值被覆盖了,由于默许情况下PDO在挪用组织函数之前分派类属性。这多是一个题目,但很轻易处置惩罚:
在挪用组织函数后设置类属性
mysql_fetch_object()解释:
假如你运用mysql_fetch_object并指定一个类——属性将在组织函数实行之前设置。这一般不是题目,然则假如你的属性是经由过程__set()把戏要领设置的,那必需起首实行组织函数逻辑,不然能够会致使一些重要题目。
惋惜mysql是一个mysqli扩大,但我们运用的是PDO。因而,有一种要领能够通知PDO在组织函数实行以后分派属性。为此,必需运用PDO::FETCH_PROPS_LATE常量。
运用fetchAll()将异常简朴,
class User { public function __construct($car) { $this->car = $car; } } $stmt = $pdo->query('SELECT name, car FROM users LIMIT 1'); $users = $stmt->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'User', ['Caterpillar']);
在猎取单个行时,我们须要同时挪用setFetchMode()和fetchObject(),这能够有点不轻易。
class User { public function __construct($car) { $this->car = $car; } } $stmt = $pdo->query('SELECT name, car FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'User'); $user = $stmt->fetchObject('User', ['Caterpillar']); /* object(User)#3 (2) { ["car"] => string(6) "Toyota" ["name"] => string(4) "John" } */
如上这段代码效力并不高,由于我们必需编写两次类名。
或许,我们能够运用fetch():
$stmt = $pdo->query('SELECT name, car FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'User', ['Caterpillar']); $user = $stmt->fetch();
然则,如上所述,假如一个类恰好是未定义的,它将没法协助我们处置惩罚毛病音讯。
从数据库中猎取类名
另有一个更风趣的标志,它通知PDO从第一列的值中猎取类名。运用这个标志,能够防止运用setFetchMode()和fetch():
$data = $pdo->query("SELECT 'User', name FROM users") ->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE); /* object(User)#3 (1) { ["name"]=> string(4) "John" } */
另外,假如能够从同一个查询建立差别类的对象,那末这类情势将异常有效
class Male {}; class Female {}; $stmt = $pdo->query('SELECT sex, name FROM users'); $users = $stmt->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE); /* array(6) { [0]=> object(Male)#3 (1) { ["name"]=> string(4) "John" } [1]=> object(Male)#4 (1) { ["name"]=> string(4) "Mike" } [2]=> object(Female)#5 (1) { ["name"]=> string(4) "Mary" } [3]=> object(Female)#6 (1) { ["name"]=> string(5) "Kathy" } }*/
但是,当运用这类情势时,好像不能够在类组织函数中通报任何参数。
更新现有对象
除了建立新对象,PDO还能够更新现有对象。只运用setFetchMode(),它将现有变量作为参数。明显,运用fetchAll()是无用的。
class User { public $name; public $state; public function __construct() { $this->name = NULL; } } $user = new User; $user->state = "up'n'running"; var_dump($user); $stmt = $pdo->query('SELECT name FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_INTO, $user); $data = $stmt->fetch(); var_dump($data, $user); /* object(Foo)#2 (2) { ["name"] => NULL ["state"] => string(12) "up'n'running" } object(Foo)#2 (2) { ["name"] => string(4) "John" ["state"] => string(12) "up'n'running" } object(Foo)#2 (2) { ["name"] => string(4) "John" ["state"] => string(12) "up'n'running" } */
如上,fetch()挪用返回的是雷同的对象,这在我看来是过剩的。还要注重,与PDO::FETCH_CLASS差别,这类情势不分派私有属性。
以上就是怎样猎取PDO对象并设置属性?(代码详解)的细致内容,更多请关注ki4网别的相干文章!