首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向旧过程程序员的OOP结构

面向旧过程程序员的OOP结构
EN

Stack Overflow用户
提问于 2015-11-30 13:43:32
回答 1查看 89关注 0票数 0

我来自于过程编程的世界,汇编程序是我的第一语言,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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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;");
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-11-30 13:47:14

如果其他类使用extend类,然后在子构造函数中调用它们,则可以对它们进行database。如果选择这种方法,请注意方法中的冲突变量。

如果Customer类扩展了Database类,那么它将访问Database等的方法。

代码语言:javascript
复制
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();
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34000057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档