Sınıflar PHP Durumlar

3 Cevap php

Ben arkadaşım için bir web uygulaması (PHP) yazıyorum ve Java benim sınırlı OOP eğitim kullanmaya karar verdim.

Benim soru, belirli kritik şeyler aslında benim sayfa bozmadan başarısız benim sınıf / uygulamasında dikkat iyi yolu budur.

Şu anda benim sorunum ben veritabanından nesnesine gerekli tüm verileri yüklemek için argüman olarak camper_id alır bir nesne "SummerCamper" olması. Birisi yok sorgu dizesi bir camper_id belirten Say, benim nesneler kurucusuna geçmek ve yük başarısız olur. Şu anda bana sadece kurucusundan yanlış dönmek için bir yol göremiyorum.

Hiçbir kayıt veritabanında veya bulunursa ben belki bir istisna atma, Özel durumlar ile bu yapabileceğini okudum doğrulama çeşit vb uygulamasından camper_id girişi başarısız olursa

Ancak, gerçekten nesne Yük başarısız oldu benim program uyarmak için harika bir yol bulmuş değil. Ben CATCH içinde yanlış dönen çalıştı ama nesne hala benim php sayfasında devam. Ben yük başarısız olursa false değişken $ is_valid = koymak ve daha sonra get yöntemini kullanarak nesneyi kontrol edebilir anlıyorum ama ben daha iyi yollar olabilir düşünüyorum.

Bir yük başarısız olursa, bir nesnenin temel fesih ulaşmanın en iyi yolu nedir? Ben yapıcısı dışından nesnesine veri yüklemek gerekir? Ben içine bakmalı tasarım deseni bazı osrt var mı?

Herhangi bir yardım mutluluk duyacağız.

function __construct($camper_id){
        try{
            $query = "SELECT * FROM campers WHERE camper_id = $camper_id";
            $getResults = mysql_query($query);

            $records = mysql_num_rows($getResults);

            if ($records != 1) {
                throw new Exception('Camper ID not Found.');
            }

            while($row = mysql_fetch_array($getResults))
            {
                $this->camper_id = $row['camper_id'];
                $this->first_name = $row['first_name'];
                $this->last_name = $row['last_name'];
                $this->grade = $row['grade'];
                $this->camper_age = $row['camper_age'];
                $this->camper_gender = $row['gender'];
                $this->return_camper = $row['return_camper'];
            }
        }
        catch(Exception $e){
            return false;
        }



    }

3 Cevap

A constructor in PHP hep dönecektir void. Bu

public function __construct()
{
    return FALSE;
}

çalışmaz. Throwing an Exception kurucudaki

public function __construct($camperId)
{
    if($camperId === 1) {
        throw new Exception('ID 1 is not in database');
    }
}

Eğer bir yerde onu yakalamak sürece komut dosyası yürütülmesine sonlandırmak istiyorum

try { 
    $camper = new SummerCamper(1);
} catch(Exception $e) {
    $camper = FALSE;
}

Bunun yerine (duydum Java yaygındır) new anahtar kelime kullanarak bunun örneklerini oluşturmak için static method SummerCamper içine yukarıdaki kodu hareket olabilir

class SummerCamper
{
    protected function __construct($camperId)
    {
        if($camperId === 1) {
            throw new Exception('ID 1 is not in database');
        }
    }
    public static function create($camperId)
    {
        $camper = FALSE;
        try {
            $camper = new self($camperId);
        } catch(Exception $e) {
            // uncomment if you want PHP to raise a Notice about it
            // trigger_error($e->getMessage(), E_USER_NOTICE);
        }
        return $camper;
    }
}

Yapabileceğin Bu şekilde

$camper = SummerCamper::create(1);

ve elde FALSE $camper zaman $camper_id yok in. statics are considered harmful, bunun yerine bir Fabrika kullanmak isteyebilirsiniz beri.

Başka bir seçenek SummerCamper tamamen gelen veritabanı erişimi decouple olacaktır. Temel olarak, SummerCamper sadece SummerCamper şeyler endişe gereken bir varlık olduğunu. Bunu kendisi inat nasıl bilgi verirseniz, size etkili bir ActiveRecord veya RowDataGateway yaratıyor. Bir DataMapper yaklaşımı ile gidebiliriz:

class SummerCamperMapper
{
    public function findById($id)
    {
        $camper = FALSE;
        $data = $this->dbAdapter->query('SELECT id, name FROM campers where ?', $id);
        if($data) {
            $camper = new SummerCamper($data);
        }
        return $camper;
    }
}

ve Varlık

class SummerCamper
{
    protected $id;
    public function __construct(array $data)
    {
        $this->id = data['id'];
        // other assignments
    }
}

DataMapper biraz daha karmaşık ama sonunda size daha rahat ve esnek Bağlamadan kodu verir. Bir göz etrafında SO, bu konularla ilgili bir dizi soru var.

Başkalarının cevapları eklemek için, tek bir yöntem istisnalar farklı atmak ve her farklı şekilde işleyebilir unutmayın:

try {
    $camper = new SummerCamper($camper_id);
} catch (NoRecordsException $e) {
    // handle no records
} catch (InvalidDataException $e) {
    // handle invalid data
}

Kurucusundan bir istisna atma muhtemelen doğru bir yaklaşım değildir. Siz uygun bir yerde bu yakalamak, ve (örneğin, bir hata sayfasını görüntülemek) gerekli önlemleri alabilir. Eğer herhangi bir kod gelmedi beri size özel yakalamak ya da neden hiç bir işe yaramadı nerede, net değil.