PHP boolean mantık bir dizeyi ayrıştırmak nasıl

4 Cevap php

Ben gibi bir dize değeri döndüren bir özel üye fonksiyonu ile bir PHP sınıfı inşa ediyorum:

'true && true || false'

Bir kamu üye işlev. (Bu dize, bazı regex eşleştirme ve emlak aramalarının bir sonucudur.) Ne yapmak istiyorum PHP döndü mantığı ayrıştırmak ve yukarıda belirtilen kamu fonksiyon çözümlü mantık mantıksal sonucu doğru veya yanlış olup olmadığını dönmek zorunda olması.

I () eval çalıştı, ama ben hiç çıktı alabilirsiniz. Ben boolean döner typecasting çalıştı ... ama operatörleri typecasting hiçbir şekilde herhangi bir fikir hehe ... var? (Daha fazla bilgiye ihtiyacınız varsa bana bildirin.)

4 Cevap

Sadece bu soruya tökezledi, ama kullanma konusunda oldukça tedirgin olmak eval, daha iyi bir çözüm aramaya devam etmeye karar verdi.

PHP'nin filter_var function, when passing in the FILTER_VALIDATE_BOOLEAN bayrağı için başka harika kullanımı keşfetti (of which there are many).

Bu "tek satır" fonksiyonu bir mantıksal bir dize (veya diğer) nesne dönüştürme safely en iyi yapmak gibi görünüyor:

<?php

/**
 * Uses PHP's `filter_var` to validate an object as boolean
 * @param string $obj The object to validate
 * @return boolean
 */
function parse_boolean($obj) {
    return filter_var($obj, FILTER_VALIDATE_BOOLEAN);
}

Ve, küçük bir test:

/**
 * Let's do some testing!
 */
$tests = array (
    "yes",
    "no",
    "true",
    "false",
    "0",
    "1"
);

foreach($tests as $test) {

    $bool = parse_boolean($test);

    echo "TESTED: ";
    var_dump($test); 

    echo "GOT: ";
    var_dump($bool);

    echo "\n\n";

}

Output:

/*
TESTED: string(3) "yes"
GOT: bool(true)


TESTED: string(2) "no"
GOT: bool(false)


TESTED: string(4) "true"
GOT: bool(true)


TESTED: string(5) "false"
GOT: bool(false)


TESTED: string(1) "0"
GOT: bool(false)


TESTED: string(1) "1"
GOT: bool(true)
*/

Ben varsayalım beri yeterince derin bakmadım, ama bu çözüm bir yere satır aşağı eval dayanır mümkündür, ancak ben hala düz eval ing üzerinde olanlar kullanarak yan ediyorum o filter_var de eval aracılığıyla boru önce herhangi bir giriş hijyen işlemek.

eval() Bu mükemmel için iyi çalışır, ama bir şey dönmek için bunu söylemek zorunda hatırlar.

$string = "true && true || false";
$result = eval("return (".$string.");"); // $result will be true

Ayrıca bir eval() doğrudan koyarak eğer herhangi bir kullanıcı girişleri sterilize emin olun.

Kullanıcının () sizin durumunuzda bir ok / iyi çözümdür eval varsayalım.

class Foo {
  private function trustworthy() {
    return 'true && true || false';
  }

  public function bar() {
    return eval('return '.$this->trustworthy().';');
  }
}

$foo = new Foo;
$r = $foo->bar();
var_dump($r);

baskılar bool(true)

(String) true && true | | false