我是php oop的新手,我正在尝试以正确的方式学习它,所以我对下面的代码有两个问题:
当我创建对象Circle和Square时,我通过Circle和Square的构造函数传递Database对象。通过这样做,我是在内存中创建和使用一个Database对象还是两个Database对象?我问这个是因为当我包含这些对象的print_r数组时,我得到了这两个:
[connection:Database:private] =>资源ID#4
从依赖注入的角度来看,这是一个很好的做法吗?
代码:
<?php
class Database{
public $server = "localhost";
private $user = "root";
private $pass = "mysql";
private $db = "ao";
private $connection;
function __construct(){
$this->openConnection();
}
public function openConnection(){
$this->connection = mysql_connect($this->server, $this->user, $this->pass);
if(!$this->connection){
die("Could not connect: " . mysql_error());
}
else{
$db = mysql_select_db($this->db, $this->connection);
if(!$db){
die("Could not connect: " . mysql_error());
}
}
}
public function closeConnection(){
if (isset($this->connection)){
mysql_close($this->connection);
unset($this->connection);
}
}
public function query($sql){
$result = mysql_query($sql, $this->connection);
$this->confirmQuery($result);
return $result;
}
public function fetchAssoc($result){
return mysql_fetch_assoc($result);
}
public function numRows($result){
return mysql_num_rows($result);
}
private function confirmQuery($result){
if(!$result){
die("Query failed: " . mysql_error());
}
}
}
$database = new Database;
?>
<?php
include("db.class.php");
//////////////////////////////////////////////////////
abstract class GeoShape{
private $db;
abstract public function area();
}
//////////////////////////////////////////////////////
class Circle extends GeoShape{
private $r = 5;
public function __construct(Database $db){
$this->db = $db;
}
public function area(){
return $this->r * $this->r * 3.14;
}
::
//////////////////////////////////////////////////////////
class Square extends GeoShape{
private $s = 5;
public function __construct(Database $db){
$this->db = $db;
}
public function area(){
return $this->s * $this->s;
}
}
$objects = array(new Circle($database), new Square($database));
foreach ($objects as $object){
echo "Area of the " . get_class($object) . ": " . $object->area() . "<br>";
}
///////////////////////////////////////////////////////////////
echo "<pre>";
print_r($objects);
?>
答案 0 :(得分:1)
默认情况下,在PHP中,作为参数传递给函数的对象将通过引用传递。如果您创建一个数据库实例并传递给这两个类,那么您将只使用单个实例(在大多数应用程序用例中都是可取的)。
作为旁注,您应该将构造函数放在GeoShape类中,以将传递的DB对象设置为local属性。现在,您在每个具体类中复制此代码。您还在抽象类中将$ db定义为private,这意味着继承类无法访问此属性。这可能不受私密保护。
另外,如果你正在努力学习正确的方法&#34;做事情,你应该非常清楚地知道使用mysql_*
方法并不是正确的方式&#34;。这些是不推荐使用的方法(请参阅PHP文档中的大读取警告)。