Kuvvet PHP dışı ilan değişkenler hata?

8 Cevap php

Ben bir değişken adı yanlış yazarsanız (hata, ne olursa olsun) havaya uçurmak için PHP zorlamak için herhangi bir yolu var mı? Ne bir sınıfın bir örneğini kullanarak ve ben bir değişken yanlışı adını büyü olur?

[Ben sadece buna alışması gerektiğini biliyorum, ama belki ad denetimini zorlamak için bir yolu var mı?]

Teşekkürler!

Edit: Üzgünüm, çok özel değildi. İşte kod, ve ben two hataları almak istiyorum. Şu anda sadece (son satır için) bir tane olsun.

error_reporting(E_ALL|E_STRICT);
class Joe {
    public $lastName;
}

$joe = new Joe();
$joe->lastNombre = "Smith";
echo "And here it is " . $jose;

8 Cevap

İşte ben böyle bir şey olur hataları tetikleyebilir nasıl göstermek için gerçekten hızlı bir şekilde çırpılmış bir şeydir:

<?php

error_reporting( E_ALL | E_STRICT );

class Joe {
    public $lastName;

    public function __set( $name, $value ) {
        if ( !property_exists( $this, $name ) ) {
            trigger_error( 'Undefined property via __set(): ' . $name, E_USER_NOTICE );
            return null;
        }
        $this->$name = $value;
    }

    public function __get( $name ) {
        if ( !property_exists( $this, $name ) ) {
            trigger_error( 'Undefined property via __get(): ' . $name, E_USER_NOTICE );
            return null;
        }
        return $this->$name;
    }
}

$joe = new Joe();
$joe->lastNom = "Smith";
echo $joe->lastNom , "\n";

?>

Eğer deneyebilirsiniz:

error_reporting(E_ALL|E_STRICT);

EDIT: Tamam, ben şimdi güncellenen soruyu okudum. Ben dışarı şans olduğunu düşünüyorum. Yani PHP geçerli bulunuyor. Bazıları bunun bir özellik olduğunu söylüyor. :)

Eğer kodu kullanabilirsiniz:

error_reporting(E_ALL);

veya bu php.ini 'de

php_error_reporting=5

http://us2.php.net/error_reporting

E_NOTICE dahil error_reporting ayarlanması biraz yardımcı olabilir. Eğer (bu yürütme bitmiyor unutmayın) bir tanımsız değişken kullanmak her bir ihbar / hatayı görüntülemek için bir eğilimi vardır.

Bu eski bir yazı olduğunu biliyorum - ama bir çözüm arıyorsanız genelinde tökezledi.

Bu benim son çözümdür:

I have an abstract class that my classes extend that throws an error on magic __get and __set.

Bu kötü - ama bir tedavi çalışır!

Yukarıdaki önerilere benzer - ama aynı zamanda bunu üzerine yazılmasını insanları durdurmak için yöntem bildirimi için 'son' ekledik.

We also use a code sniffer to catch these - but I wanted to get my error messages 'live' as I coded, instead of having to wait for a report from the sniffer. (Also people can ignore sniff reports!)

Sample code below

   <?php
/**
 * Abstract
 * Some default Abstract functions that everything should extend
 *
 * @package    example
 * @subpackage lib
 */

/**
 * Class mh_abstract
 * Some default MH Abstract functions that everything should extend
 *
 * @package    example
 * @subpackage lib
 */
abstract class lib_abstract
{
    /**
     * Throws an error if php magic set is called
     *
     * @param string        $key
     * @param string|object $value
     *
     * @throws Exception When trying to set a new class property
     */
    final public function __set($key, $value)
    {
        // get if the thing we are trying to set is a object
        if(is_object($value))
        {
            // if so let's just report it's name, not the full object
            $value = 'object:'.get_class($value);
        }

        // throw the error!
        throw new mh_lib_error_dev_unknownClassProperty('Tried to set new property '.$key.' with value '.$value);
    }

    /**
     * Throws an error if php magic get is called
     *
     * @param string $key
     *
     * @throws Exception When trying to set a new class property
     */
    final public function __get($key)
    {

        // throw the error!
        throw new mh_lib_error_dev_unknownClassProperty('Tried to get new property '.$key);
    }
}

Bir soultion zaman alıcı ve ayarlayıcıları kullanmak olabilir. Ama offcourse: doğru alıcılar yazmak zorunda. Yani belki Nick Prestas cevap iyisi! ;-)

Bildirilmemiş özelliğini yakalamak için onları yakalamak için __ Set () sihirli yöntemi ayarlayabilirsiniz

function __set($sKey, $sValue)
{
   // any setter data should be *returned* here

   // NOTE: this function will only get called if the property is not
   // publicly accessible.
   trigger_error("Non-existing property name ".$sKey, E_USER_WARNING);
}