我来自于过程编程的世界,汇编程序是我的第一语言,PL/1和Cobol是我学习的大多数(坏的)习惯语言。
这是我在这里的第一篇文章,如果我没有做到100%正确的话,请接受我的道歉。
我正在重写我们的前端和后端系统,从过程php到OOP,我真的不明白该使用什么结构。
在旧系统中,我们有许多脚本,其中包含了xxx.inc.php和所使用的函数,而这些xxx.inc.php又包含了其他xxx.inc.php,如db.inc.php、api_pj.inc.php等。
为了实现这个OOP,我为每个类创建了一个文件并自动加载它们,但是我不知道如何处理常见的类(数据库、与外部api的连接等等)。在测试时,我使用了继承,它运行得很好,但感觉很奇怪。我看不出客户类是数据库类的子类。此外,我也不明白什么是需要界定的和不需要界定的。应该定义类中的所有变量吗?
下面的示例不起作用,因为数据库连接对Customer类不可用。当让“类客户扩展DB”代替时,一切都很好,但我认为还有更正确的方法吗?
从Alex Andrei回复后编辑了下面的代码
the_example_page.php
// autoloader
spl_autoload_register(function ($class) {
require_once 'classes/' . $class . '.class.php';
});
// data for testing
$customer_id = '12090';
$order_id = '31480';
// db
$db = new DB();
$db_conn = $db->db_connect();
// get customer name data and print it:
$customer = new Customer($db_conn);
$customer_data = $customer->get_customer_info($customer_id);
print $customer_data['name'];
// get order date and print it:
$order = new Order($db_conn);
$order_data = $order->get_order_info($order_id);
print $order_data['date'];DB.class.php
class DB
{
public function __construct() {}
public function db_connect()
{
static $db_conn;
if( !$db_conn )
{
$db_conn = pg_connect("dbname=database user=user password=PaSsWoRd");
}
return $db_conn;
}
public function db_exec($sql)
{
if( !$sql ) return;
$db_conn = $this->db_connect();
$result = @pg_exec($db_conn,$sql);
if( !$result )
{
return;
}
$ret[result] = $result;
return $ret;
}
public function db_getrow(&$a)
{
# a bunch of stuff in real function, but here only a plain fetch_array as example
$ret = pg_fetch_array($a);
return $ret;
}
}Customer.class.php
class Customer
private $conn;
{
public function __construct($db)
{
$this->conn=$db;
}
public function get_customer_info($customer_id)
{
return $this->conn->db_getrow($this->conn->db_exec("SELECT * FROM customer WHERE customerid = $customer_id;"));
}
public function get_all_customers($status)
{
return $this->conn->db_exec("SELECT * FROM customer WHERE status = $status;");
}
}Order.class.php
class Order
{
private $conn;
{
public function __construct($db)
{
$this->conn=$db;
}
public function get_order_info($order_id)
{
return $this->conn->db_getrow($this->conn->db_exec("SELECT * FROM order WHERE orderid = $order_id;"));
}
public function get_all_orders($status)
{
return $this->conn->db_exec("SELECT * FROM order WHERE status = $status;");
}
}发布于 2015-11-30 13:47:14
如果其他类使用extend类,然后在子构造函数中调用它们,则可以对它们进行database。如果选择这种方法,请注意方法中的冲突变量。
如果Customer类扩展了Database类,那么它将访问Database等的方法。
class Database{
public function __construct(){
}
/* other methods*/
}
class Customer extends Database{
public function __construct(){
parent::__construct();
}
}
class Order extends Database{
public function __construct(){
parent::__construct();
}
}https://stackoverflow.com/questions/34000057
复制相似问题