Bu PHP sınıfı yapmak için doğru yolu nedir?

5 Cevap php

Merhaba Sadece PHP sınıflarını kullanma hakkında daha fazla öğrenme yaşıyorum. Ben aşağıda kod bok olduğunu biliyorum ama yardıma ihtiyacım var.

Birisi sadece ben doğru yönde gidiyorum, bana bildirin.

Yeni bir profil nesnesi oluşturulduğunda mysql tüm profil verileri almak için Amacım bu sınıf bir kullanıcının profil sayfası içine dahil olması için, ben istiyorum, o zaman ben sayfadaki herhangi bir öğeyi görüntülemek mümkün olmak istiyorum Sadece böyle bir şey ile

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

İşte benim kod şimdiye kadar, ben doğru yönde gidiyorum, ne kadar yanlış olduğunu ya da söyle lütfen?

Ayrıca yerine echo $ profile-> user_name kullanarak; 50 + profil mysql fileds için, bazen örneğin, verilerle şeyler yapmanız gereken bir kayıt boşsa, onları dönüştürmek için çalışması gereken başka bir kod var da o zaman alternatif bir değeri göstermek istiyorum tarih ve doğum katılmak , böylece bilgi birikimi ile, ben yöntemlerle olmalıdır? Gibi 50 + farklı yöntemler?

<?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 Cevap

Sen PHP'nin bakmak isteyebilirsiniz magic methods daha sonra bunu / Büyük bir numara ayarlamak döndürmek için kullanabileceğiniz, (genellikle "almak" ve yöntemleri "set") Eğer yöntemler az sayıda oluşturmak için izin çok kolay bir şekilde özel / korumalı bir değişken. Daha sonra aşağıdaki kodu, örneğin olabilir (soyut ama umarım fikir alırsınız):

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;
  }
}

Diğerleri de belirttiğim gibi, belki bir ORM veya benzeri gibi bir şey içine bakarak (Doktrini, ActiveRecord vb) Yukarıdaki tüm sizin için yapılır, değerli bir egzersiz, olabilir :-)

Edit: Ben muhtemelen yukarıdaki uygulamak sonra özelliklerine erişmek istiyorum nasıl bahsetmeliydik (bütünlüğü için!)

$profile = new Profile;

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

// retrieving
echo $profile->user_name;

ve bu yukarıda tanımlanan sihirli yöntemlerini kullanacak.

Lütfen "Profil" genişletmek olabilir, ve size yazdım tüm bu işlevi zaten yerinde olacağını, böylece bu tüm soyut sınıf çeşit yapım içine bakmak gerekir.

Eğer bir hazır çözüm ilginizi çekebilir - bu object relational mappers denir.

Sen PHP ActiveRecord, kolayca hangi ORM kodu kendiniz yazmadan böyle bir şey yapmak için izin vermelidir kontrol etmelisiniz.

Diğer benzer kütüphaneler Doctrine ve Outlet içerir.

Kamu değişkenlerin bir sürü kullanmayın. En kötü ihtimalle, bu tür $profile gibi bir değişken yapmak. Sonra tüm alanları $profile['body_type'] veya ne olursa olsun vardır.

Bu Martin Fowler kitabında Refactoring bir code smell çağrıları, benim için bir Data Class gibi görünüyor.

Veri sınıfları çocuk gibidir. Bir başlangıç ​​noktası olarak tamam, ama bir yetişkin nesnesi olarak katılmak için, onlar biraz sorumluluk almak gerekir.

O işaret, durum burada olduğu gibi, bu

Erken evrelerde bu sınıfların ortak alanlar olabilir. Eğer öyleyse, kimse fark etmez derhal Encapsulate Field önce.

Eğer bir veya birkaç birkaç ilişkisel diziler halinde birçok alanları açmak, sonra Fowler tavsiyem

düzgün kapsüllü olup olmadığını görmek için kontrol edin ve değiştirilmemesi gerektiğini her alanda Encapsulate Collection if they aren't. Use Remove Setting Method geçerlidir.

Eğer Profile sınıf davranışları sahip olmuştur, ve diğer sınıflar (müşterileri) bu davranışları kullanabilirsiniz olduğunda Daha sonra, bu için bu davranışları (ve ilişkili herhangi bir veri) bazı taşımak için mantıklı olabilir kullanarak istemci sınıfları Move Method .

Eğer bütün bir yöntem hareket edemiyorsanız, alıcılar ve ayarlayıcıları Extract Method to create a method that can be moved. After a while, you can start using Hide Method kullanın.

Normalde, bir sınıf bir nesne (gönderebilirsiniz mesajları) için soyut yapabilirsiniz do şeyleri oluşturulmuş olur. PHP bir bire-bir eşleme veritabanı alanlarına kesişimi: Eğer oluşturduğunuz yol daha bir sözlük gibidir. Çok katma değeri, o bile yok: Eğer açık bir yarar kalmadan yönlendirme ekstra bir katman ekleyin.

Aksine, sınıf örneğin içeren, bir 'devlet' denilen ne içermesi gerekir Belirli bir tablo bir id alanı, ve örneğin bazı yöntemler (bazı demek ..) "AddressString ()", "marriedTo ()", ....

Eğer performansı hakkında endişe varsa, cache tamamen farklı bir husustur ve tablo alanları, herhangi bir başka toplanmış olabilir sınıfının (a Cache sınıf veya tarafından uygulanmalıdır olabilir .)

Ben bu tasarımda gördüğünüz ana OO ihlali "sormayın, söyle" ilkesinin ihlalidir.