您好我正在学习更多关于在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;
}
}
答案 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代码的情况下执行此类操作。
答案 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违规违反了“告诉,不要问”的原则。