开发者

I think I'm doing it wrong (PHP Class creation & signs and more)

Currently I have a class called user that I want to create with different variables, but I think I'm doing it wrong.

Currently I have a class "Unit" with these two functions

public function __construct($table, $id) {
    require_once('database.php');
    require_once('app.php');
    require_once("postmark.php");
    $this->table = $table;
    $this->valid = true;

    if(!$id) {
        $this->valid = false;
    }

    $this->populate($id);
}

public function populate($id) {
    $db = new DB();
    $q = $db->where('id', $id)->get($this->table);
    $resp = $q->fetchAll();
    foreach ($resp as $row) {
        foreach ($row as $key=>$value) {
            if(!is_int($key))
                $this->$key = html_entity_decode($value, ENT_QUOTES);
            if(is_null($value)) {
                $this->$key = null;
            }
        }
    }
    if(count($resp) <= 0) $this->valid = fa开发者_StackOverflow中文版lse;
    $verdict = !$db->error;

    $db = null;
    unset($db);

    return $verdict;    
}

And then my "User" class extends it like so

public function __construct($id, $hash = null, $verify = null, $api = null) {
    if($api)
    $value = $this->apiToId($api);
    else if($verify)
    $value = $this->verifyToId($verify);
    else if($hash)
    $value = $this->hashToId($hash);
    else 
    $value = $id;

    parent::__construct("users", $value);
}

But I can't help but think this is poor in design. A few things I have seen in the past are the use of ampersands, possibly making it so I could do

$user = new User()->fromId($id);

Or

$user = new User()->withHash($hash);

Instead of passing it a long list of null params. That or I could improve the way inheritance works. While I like to think I know what I'm doing with PHP, I'd really like some help looking in the right direction. PHP's docs are so cumbersome, that I never no where to look, but always find cool useful tools. I'm wondering how I can improve this for more flexibility and structure.


  • Move includes to the very top of your php file. Anything that needs to be conditionally included is probably poorly designed.
  • Your unit class should be declared as abstract. This prevents anyone from instantiating a unit. You can only declare subclasses of it.
  • Any functions relating to your class should be declared as methods. Thus, the example given in an answer now-removed is a terrible choice. The function alloc really should be a static function defined in User. Code snippet at bottom.
  • Your init functions should be declared as static and return a new instance of the class. Defining an instance of the class to re-instantiate the class is just a bad idea.
  • Your database connection should use a Singleton pattern. Look it up if you need to.

Post your full code and comment on this answer if you'd like some help implementing all of this.


$user  = User::initWithHash($hash);


//your create method:
/**
 * Creates and returns a new instance of the class. Useful
 * @return an instance of User.
 */
public static function create() {
    return new User();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜