【问题标题】:Simple PHP Person class modeling简单的 PHP Person 类建模
【发布时间】:2013-09-06 11:46:06
【问题描述】:

这是我第一次使用 OO PHP,我创建了一个 Person 类,我需要通过查询数据库或 POST 值来创建 Person 对象。然后我需要将数据保存到 DB。

这是我的代码,我不知道这是否正确。我需要一些建议。

class Persona {
    protected $id=NULL;
    protected $nome;
    protected $cognome;
    protected $cf=NULL;
    protected $indirizzo=NULL;
    protected $civico=NULL;
    protected $citta=NULL;
    protected $cap=NULL;
    protected $provincia=NULL;
    protected $nazione=NULL;
    protected $telefono=NULL;
    protected $fax=NULL;
    protected $cellulare=NULL;
    protected $email;
    protected $data_registrazione;
    protected $tipo_registrazione;


    public function createPersona($postData=NULL,$id=NULL,$email=NULL)
    {
        global $_CONFIG;
        if(is_array($postData) && isset($postData['nome']) && isset($postData['cognome']) && isset($postData['email']) && isset($postData['tipo_registrazione']))
        {
            $record=$postData;
        }elseif(isset($id)){
            $result=mysql_query("SELECT * FROM ".$_CONFIG['tbl_persone']." WHERE id='".escape_string($id)."'");
            if(mysql_num_rows($result)!=1) return false;
            $record = mysql_fetch_assoc($result);
        }elseif(isset($email)){
            $result=mysql_query("SELECT * FROM ".$_CONFIG['tbl_persone']." WHERE email='".strtolower(escape_string($email))."'");
            if(mysql_num_rows($result)!=1) return false;
            $record = mysql_fetch_assoc($result);
        }else{
            return false;
        }

        if(isset($record['cf'])) $record['cf']=strtoupper($record['cf']);
        if(isset($record['cap'])) $record['cap']=strtoupper($record['cap']);
        if(!isset($record['nazione']) && isset($record['prefisso'])) $record['nazione']=$record['prefisso'];
        $record['email']=strtolower($record['email']);
        if(!isset($record['data_registrazione'])) $record['data_registrazione']=date('Y-m-d H:i:s');

        $vars=get_object_vars($this);
        foreach($vars as $key=>$value)
        {
            if(isset($record[$key])){$this->$key=$record[$key];}
        }
        if(!$this->validatePersona())return false;

        return true;        
    }

    protected function validatePersona()
    {   
        if(isset($this->id) && !validateID($this->id)) return false;
        if(isset($this->cf) && !validateCF($this->cf)) return false;
        if(isset($this->cap) && !validateCAP($this->cap)) return false;
        if(isset($this->email) && !validateEmail($this->email)) return false;
        return true;
    }

    public function savePersona()
    {   
        global $_CONFIG;
        $vars=get_object_vars($this);
        foreach($vars as $key=>$value)
        {
            if($key!='id')
            {
                if(isset($this->$key))
                {
                    $columns.=$key.",";
                    $values.="'".escape_string($this->$key)."',";
                }
            }
        }

        if(!mysql_query("INSERT INTO ".$_CONFIG['tbl_persone']." (".substr($columns,0,-1).") VALUES (".substr($values,0,-1).")"))
        {
            return false;
        }else{
            return true;
        }
    }
}

$p=new Persona();
if(!$p->createPersona($_POST)){
    echo 'Si è verificato un errore.<br />Riprova più tardi. [0]';
    exit;
}

if($p->createPersona(NULL,NULL,$_POST['email'])){
    echo 'Indirizzo email già registrato.';
    exit;
}

if(!$p->savePersona()){
    echo 'Si è verificato un errore.<br />Riprova più tardi. [2]';
    exit;
}

第二步是使用我的数据库中的人员数据创建一个动态 HTML 表,现在通过程序语言获取数据库并创建一个数组,然后使用 foreach 构造打印该表,但我不知道如何面向对象语言。

谢谢大家

弗朗西斯科

【问题讨论】:

  • 非常适合初学者。阅读有关模式、活动记录、表网关、映射器的信息。有一些普遍接受的方式来做你想做的事情。

标签: php mysql database oop modeling


【解决方案1】:
  1. 如果要将数据库查询结果映射到对象,请改用PDOmysql 驱动程序已过时,强烈建议不要使用。此外,PDO 完全是 OOP。在线阅读一些教程。
  2. protected $id=NULL; 您不必将 null 显式分配给未启动的属性。此外,如果您知道要从外部访问属性(即通过对象),则将属性设置为 public: public $id; 就足够了。 protected 的目的是,如果您希望某些属性可用于从您的主类(= 子类)派生的类。
  3. 不要使用关键字global。使用带有常量的配置类或从包含在单独文件中的数组中读取设置。您可以将该数组传递给类构造函数。
  4. 如果 createPersona 是您的主要构造方法,您可以将其重命名为 __contruct,因此只需这样做:$persona = new Persona($_POST);

也写null而不是NULL,这样更简洁,效率更高。

function __construct(Array $postData = array(), $id = null, $email = null) {

}

【讨论】:

  • 1.我会做的。 2. 未初始化的属性为null,不用我显式了,ok。我让它们受到保护,因为我知道 OOP 的基础之一是隔离,所以我可以保护它们免受其他代码的影响(在我的简单情况下,我应该使用私有属性)。 3.好的,数组似乎是一种简单明了的方法。我将看看一些图书馆是如何做到这一点的。 4.我知道,但是如果mysql查询或者验证有错误需要返回true或者false,所以我把它改成了simple public funcion。感谢您的建议,非常有帮助,如果您有其他建议我很感兴趣
  • @TheEscapist 当然。您实际上可以在构造中触发异常,从而完全控制验证。您可以创建一个状态属性,以检查施工期间是否一切顺利:if ($p-&gt;valid === true) { // things are okay} 如果您也需要 PDO 方面的帮助,请告诉我 :)
  • 好的,但这意味着我必须在每次构建后都进行检查,因此我可以轻松地将 validatePersona() 切换为 public 并在不添加“有效”属性的情况下进行控制。另一种解决方案(但告诉我它是否正确且有意义)是创建一个工厂类,帮助我通过 ID、POST 或 EMAIL(或其他,如果我需要)构造一个带有公共函数和只有两个参数的 Person和类型。因此,在 Person 类中,我只有所需的属性、分配数据的构造函数和其他相关函数。
  • @TheEscapist 没错,您可以创建一个名为 PersonaFabbrica 的工厂类,让其使用 PDO 进行查询,然后创建 Persona 作为辅助类。
【解决方案2】:

@silkfire @DevZer0 好的,所以我编辑了我之前的代码,你觉得呢?

class factoryPersona {  
    public function createPersona($origin,$by)  
    {  
        switch($by)  
        {  
            case 'post':  
                // get data from $_POST to $array  
                break;  
            case 'id':  
                // get data from DB to $array  
                break;  
            case 'email':  
                // get data from DB to $array  
                break;  
        }  
        $persona=new Persona($array);  
        if(!$persona->validatePersona())  
        {  
            // validation error  
            exit;  
        }  
        return $persona;  
    }  
}  

class Persona {  
    private $id;  
    private $nome;  
    private $cognome;  
    private $cf;  
    private $indirizzo;  
    private $civico;  
    private $citta;  
    private $cap;  
    private $provincia;  
    private $nazione;  
    private $telefono;  
    private $fax;  
    private $cellulare;  
    private $email;  
    private $data_registrazione;  
    private $tipo_registrazione;  

    public function __construct($array=null)  
    {  
        // assignments  
    }  

    public function validatePersona()  
    {  
        if(isset($this->id) && !validateID($this->id)) return false;  
        if(isset($this->cf) && !validateCF($this->cf)) return false;  
        if(isset($this->cap) && !validateCAP($this->cap)) return false;  
        if(isset($this->email) && !validateEmail($this->email)) return false;  
        return true;  
    }  

    public function savePersona()  
    {  
        // save person to DB  
    }   
}  

$persona=new factoryPersona;  
$persona=$persona->createPersona($_POST,'post');  
$persona->savePersona();

【讨论】:

    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2011-04-22
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多