Varsayılan olarak, bir nesne dönüş yanlış yapmak mümkün mü?

11 Cevap php

Ben daha önce bunu sormak için çalıştı, ve soru berbat, bu yüzden tekrar deneyeceğim. Bir if deyimi koymak zaman varsayılan bir nesne return false yapmak mümkün mü? Ne istiyorum:

$dog = new DogObject();
if($dog)
{
   return "This is bad;"
}
else
{
   return "Excellent!  $dog was false!"
}

Bu mümkün bir yolu var mı? Tamamen gerekli değil, ama bana kod bazı satırları kaydetmek istiyorsunuz. teşekkürler!

11 Cevap

Hayır, PHP operator overloading için destek vardır. Belki de gelecekteki bir sürümünde eklemek gerekir.

Instanceof anahtar sözcüğünü kullanın.

Örneğin

$result = Users->insertNewUser();

if($result instanceof MyErrorClass){
  (CHECK WHAT WENT WRONG AND SAY WHY)
} else {
  //Go on about our business because everything worked.
}

Info is here.

Ben kendimi bu yapmak için çalışan ve çalışmak için görünür bir çözüm bulundu.

Farklı bir çözüm kullanmak asker anlatarak soruyu cevaplamak için çalışıyorlardı diğerlerine yanıt olarak, ben de sorunun nedenini açıklamaya çalışacağız. Orijinal poster veya ben ne nokta istisna işleme özellikleri kullanmak ve biz noktadan içeri bu sınıfı kullanan bir kod bu yükü koymak değil, çünkü bir istisna kullanmak istiyorsanız, en azından benim için, bu kullanmak mümkün oldu sorunsuz olmayan bir nesne yönelimli veya non-istisna tabanlı tarzında yazılmış olabilir diğer PHP kodu sınıf. Birçok yerleşik PHP fonksiyonları başarısız işlemleri için sahte bir sonucu arzu edilir olduğu şekilde yazılır. Aynı zamanda, biz kendi kodunda özel bir şekilde bu nesneyi idare edebilmek isteyebilirsiniz.

Örneğin, böyle bir şey yapmak isteyebilirsiniz:

if ( !($goodObject = ObjectFactory::getObject($objectType)) ) {
  // if $objectType was not something ObjectFactory could handle, it
  // might return a Special Case object such as FalseObject below
  // (see Patterns of Enterprise Application Architecture)
  // in order to indicate something went wrong.
  // (Because it is easy to do it this way.)
  //
  // FalseObject could have methods for displaying error information.
}

Here's a very simple implementation.

class FalseObject {
  public function __toString() {
    // return an empty string that in PHP evaluates to false
    return '';
  }
}

$false = new FalseObject();

if ( $false ) {
  print $false . ' is false.';
} else {
  print $false . ' is true.';
}

print '<br />';

if ( !$false ) {
  print $false . ' is really true.';
} else {
  print $false . ' is really false.';
}

/ / Sadece emin beklenmedik bir şey oluyor yapmak için $ false basmak.

The output is:

is false. is really false.

Ben bu test ettik ve sizin gibi sınıf içinde bazı bildirilen değişkenler, olsa bile çalışır:

class FalseObject {
  const flag = true;
  public $message = 'a message';
  public function __toString() {
    return '';
  }
}


Biraz daha ilginç uygulama olabilir:

class FalseException extends Exception {
  final public function __toString() {
    return '';
  }
}

class CustomException extends FalseException { }

$false = new CustomException('Something went wrong.');

Daha önce olduğu gibi aynı test kodu kullanarak, false false değerlendirir $.

Bu kullan? Değil bir gerçek temiz çözüm, ama ne istediğinizi yapar:

<?php

    class Foo
    {
    	private $valid = false;

    	public function Bar ( )
    	{
    		// Do stuff
    	}

    	public function __toString ( )
    	{
    		return ( $this -> valid ) ? '1' : '0';
    	}
    }

?>

Sıfır false, bir true PHP tarafından kabul olarak kabul edilir

"If ifadesi" sadece mantıksal olarak orada değişkeni değerlendirmek şey koymak.

Bu çalışması için senin örnekte, $ köpek always false olması gerekir. Değişken bir boolean ifade değerlendirilmelidir üzereyken anlatmak için hiçbir yolu yoktur.

Nihai amaç burada nedir? Hangi kod satırları kurtarmaya çalışıyorsun?

Ben nesnenin kendisi hakkında emin değilim. Olası. Siz, böyle bir şey deneyin DogObject sınıfına bir ortak özelliği ekleyin ve sonra bu false varsayılan olarak ayarlanmış olabilir. Gibi.

class DogObject
{
    var $isValid = false;

    public function IsValid()
    {
        return $isValid;
    }
}

Bunu örneğini ne zaman Ve sonra, varsayılan olarak yanlış olur.

$dog = new DogObject();
if($dog->IsValid())
{
   return "This is bad;"
}
else
{
   return "Excellent!  $dog was false!"
}

Sadece bir düşünce.

Ben ne senin sormamda anlamak, ben bunu yapmak istiyorum düşünüyorum:

if (!$dog){
     return "$dog was false";
}

! anlamına gelir. SO, okumak "değil ise köpek ya da köpek doğru değil ise" olabilir

Ne istiyorsun şartlar altında if($dog) false değerlendirmek için? Eğer tam anlamıyla için sordunuz ne yapamam, ama belki koşullandırılmış ne isterseniz onu yapar bir şey yerini olabilir.

class UserController
{
  public function newuserAction()
  {
    $userModel = new UserModel();
    if ($userModel->insertUser()) {
      // Success!
    } else {
      die($userModel->getError());
    }
  }
}

Veya

class UserController
{
  public function newuserAction()
  {
    $userModel = new UserModel();
    try {
      $userModel->insertUser()
    }
    catch (Exception $e) {
      die($e);
    }
  }
}

Hataları işlemek için bir milyon yolu vardır. Tüm hata karmaşıklığı ve kurtarma seçenekleri miktarına bağlıdır.

Nasıl aşağıdaki C # gibi bir örtük Döküm Operatörü kullanmaya ne dersiniz?

şöyle:

    class DogObject
    {
        public static implicit operator bool(DogObject a)
        {
            return false;
        }
    }

Sonra gidebilirsin ...

    var dog = new DogObject();

    if(!dog)
    {
        Console.WriteLine("dog was false");
    }

Geçenlerde boş nesne desen kullanarak, benzer bir şey yapmak zorunda. Ne yazık ki, boş nesne gerçek dönüyordu ve söz konusu değişken bazen (işlevin varsayılan parametre) gerçek bir boş değer oldu. Bu her ne kadar ((string) $ var) {boş diziler için işe yaramaz eğer ben ile geldi iyi yoluydu.