这是执行此PHP类的正确方法吗?

时间:2009-12-25 18:14:38

标签: php mysql class

您好我正在学习更多关于在PHP中使用类的知识。我知道下面的代码是垃圾,但我需要帮助。

如果我朝着正确的方向前进,有人可以告诉我。

我的目标是将这个类包含到用户配置文件页面中,当创建新的配置文件对象时,我希望它能从mysql中检索所有配置文件数据,然后我希望能够显示任何项目在页面上只使用这样的东西

$profile = New Profile;
echo $profile->user_name;

到目前为止,这是我的代码,请告诉我到目前为止出了什么问题,或者我是否朝着正确的方向前进?

而不是使用echo $ profile-> user_name;对于50多个配置文件的mysql文件,有时我需要对数据进行处理,例如连接日期和birthdate有其他代码必须运行才能转换它们,如果记录为空,那么我想显示一个替代值,有了这个知识,我应该使用方法吗?像50多种不同的方法一样?

<?PHP
//Profile.class.php file

class Profile
{
    //set some profile variables
    public $userid;
    public $pic_url;
    public $location_lat;
    public $location_long;
    public $user_name;
    public $f_name;
    public $l_name;
    public $country;
    public $usa_state;
    public $other_state;
    public $zip_code;
    public $city;
    public $gender;
    public $birth_date;
    public $date_create;
    public $date_last_visit;
    public $user_role;
    public $photo_url;
    public $user_status;
    public $friend_count;
    public $comment_count;
    public $forum_post_count;
    public $referral_count;
    public $referral_count_total;
    public $setting_public_profile;
    public $setting_online;
    public $profile_purpose;
    public $profile_height;
    public $profile_body_type;
    public $profile_ethnicity;
    public $profile_occupation;
    public $profile_marital_status;
    public $profile_sex_orientation;
    public $profile_home_town;
    public $profile_religion;
    public $profile_smoker;
    public $profile_drinker;
    public $profile_kids;
    public $profile_education;
    public $profile_income;
    public $profile_headline;
    public $profile_about_me;
    public $profile_like_to_meet;
    public $profile_interest;
    public $profile_music;
    public $profile_television;
    public $profile_books;
    public $profile_heroes;
    public $profile_here_for;
    public $profile_counter;

    function __construct($session)
    {
    // coming soon
    }

    //get profile data
    function getProfile_info(){
        $sql = "SELECT user_name,f_name,l_name,country,usa_state,other_state,zip_code,city,gender,birth_date,date_created,date_last_visit,   
        user_role,photo_url,user_status,friend_count,comment_count,forum_post_count,referral_count,referral_count_total,
        setting_public_profile,setting_online,profile_purpose,profile_height,profile_body_type,profile_ethnicity,
        profile_occupation,profile_marital_status,profile_sex_orientation,profile_home_town,profile_religion,
        profile_smoker,profile_drinker,profile_kids,profile_education,profile_income,profile_headline,profile_about_me,
        profile_like_to_meet,profile_interest,profile_music,profile_television,profile_books,profile_heroes,profile_here_for,profile_counter
        FROM users WHERE user_id=$profileid AND user_role > 0";
        $result_profile = Database::executequery($sql);

        if ($profile = mysql_fetch_assoc($result_profile)) {
            //result is found so set some variables
            $this->user_name = $profile['user_name'];
            $this->f_name = $profile['f_name'];
            $this->l_name = $profile['l_name'];
            $this->country = $profile['country'];
            $this->usa_state = $profile['usa_state'];
            $this->other_state = $profile['other_state'];
            $this->zip_code = $profile['zip_code'];
            $this->city = $profile['city'];
            $this->gender = $profile['gender'];
            $this->birth_date = $profile['birth_date'];
            $this->date_created = $profile['date_created'];
            $this->date_last_visit = $profile['date_last_visit'];
            $this->user_role = $profile['user_role'];
            $this->photo_url = $profile['photo_url'];
            $this->user_status = $profile['user_status'];
            $this->friend_count = $profile['friend_count'];
            $this->comment_count = $profile['comment_count'];
            $this->forum_post_count = $profile['forum_post_count'];
            $this->referral_count = $profile['referral_count'];
            $this->referral_count_total = $profile['referral_count_total'];
            $this->setting_public_profile = $profile['setting_public_profile'];
            $this->setting_online = $profile['setting_online'];
            $this->profile_purpose = $profile['profile_purpose'];
            $this->profile_height = $profile['profile_height'];
            $this->profile_body_type = $profile['profile_body_type'];
            $this->profile_ethnicity = $profile['profile_ethnicity'];
            $this->profile_occupation = $profile['profile_occupation'];
            $this->profile_marital_status = $profile['profile_marital_status'];
            $this->profile_sex_orientation = $profile['profile_sex_orientation'];
            $this->profile_home_town = $profile['profile_home_town'];
            $this->profile_religion = $profile['profile_religion'];
            $this->profile_smoker = $profile['profile_smoker'];
            $this->profile_drinker = $profile['profile_drinker'];
            $this->profile_kids = $profile['profile_kids'];
            $this->profile_education = $profile['profile_education'];
            $this->profile_income = $profile['profile_income'];
            $this->profile_headline = $profile['profile_headline'];
            $this->profile_about_me = $profile['profile_about_me'];
            $this->profile_like_to_meet = $profile['profile_like_to_meet'];
            $this->profile_interest = $profile['profile_interest'];
            $this->profile_music = $profile['profile_music'];
            $this->profile_television = $profile['profile_television'];
            $this->profile_books = $profile['profile_books'];
            $this->profile_heroes = $profile['profile_heroes'];
            $this->profile_here_for = $profile['profile_here_for'];
            $this->profile_counter = $profile['profile_counter'];
        }
    //this part is not done either...........
    return $this->pic_url;
    }
}

5 个答案:

答案 0 :(得分:4)

您可能想看一下PHP的magic methods,它允许您创建少量方法(通常是“get”和“set”方法),然后您可以使用它们返回/设置大私有/受保护变量的数量非常容易。然后你可以得到例如下面的代码(摘要,但希望你能得到这个想法):

class Profile
{
  private $_profile;

  // $_profile is set somewhere else, as per your original code

  public function __get($name)
  {
    if (array_key_exists($name, $this->_profile)) {
      return $this->_profile[$name];
    }
  }

  public function __set($name, $value)
  {
    // you would normally do some sanity checking here too
    // to make sure you're not just setting random variables

    $this->_profile[$name] = $value;
  }
}

正如其他人所建议的那样,也许正在寻找像ORM或类似的东西(Doctrine,ActiveRecord等)可能是值得的练习,其中所有上述内容都是为你完成的: - )

编辑:我应该提到你在实施上述内容后如何访问这些属性(为了完整性!)

$profile = new Profile;

// setting
$profile->user_name = "JoeBloggs";

// retrieving
echo $profile->user_name;

这些将使用上面定义的魔术方法。

答案 1 :(得分:3)

您应该考虑制作某种类来抽象这一切,以便您的“个人资料”可以扩展它,并且您编写的所有功能都已经到位。

您可能对现成的解决方案感兴趣 - 这些解决方案称为对象关系映射器

您应该查看PHP ActiveRecord,这样可以轻松地让您在不自己编写ORM代码的情况下执行此类操作。

其他类似的库包括DoctrineOutlet

答案 2 :(得分:1)

不要使用一大堆公共变量。最糟糕的是,将其设为一个变量,例如$profile。然后所有字段都是$profile['body_type']或其他。

答案 3 :(得分:1)

这对我来说就像是数据类,Martin Fowler在他的书code smell中称之为Refactoring

  

数据类就像孩子一样。他们可以作为一个起点,但作为一个成年人参与,他们需要承担一些责任。

他指出,就像这里的情况一样,

  

在早期阶段,这些课程可能有公共领域。如果是这样,您应该在任何人注意之前立即 Encapsulate Field

如果你将许多字段变成一个或几个关联数组,那么福勒的建议就是

  

检查它们是否已正确封装,如果不是,则应用 Encapsulate Collection 。在任何不应更改的字段上使用 Remove Setting Method

稍后,当您的Profile类被赋予行为,而其他类(其客户端)使用这些行为时,将这些行为中的一些(以及任何相关数据)移至客户端类使用 Move Method

  

如果您无法移动整个方法,请使用 Extract Method 创建可移动的方法。一段时间后,您可以开始在getter和setter上使用 Hide Method

答案 4 :(得分:0)

通常,会创建一个类来抽象您可以到对象的内容(您可以发送的消息)。您创建它的方式更像是字典:PHP语法与数据库字段的一对一映射。其中没有太多附加价值:你插入一个额外的间接层而没有明显的好处。

相反,该类必须包含所谓的“状态”,包含例如某个表的id字段,以及某些方法(某些......),例如“addressString()”,“marriedTo()”,....

如果您担心性能,可以缓存表的字段,这是一个完全不同的问题,应该由另一个可以聚合的类实现(Cache类或者无论如何)。

我在本设计中看到的主要OO违规违反了“告诉,不要问”的原则。