Bug #70791 [Nab->Csd]: Inconsistent method_exists() property_exists() behavior.

From: Date: Tue, 03 Sep 2019 12:04:00 +0000
Subject: Bug #70791 [Nab->Csd]: Inconsistent method_exists() property_exists() behavior.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-222539@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=70791&edit=1 ID: 70791 Updated by: nikic@php.net Reported by: phplists at stanvassilev dot com Summary: Inconsistent method_exists() property_exists() behavior. -Status: Not a bug +Status: Closed Type: Bug Package: *General Issues Operating System: OSX PHP Version: 7.0.0RC5 -Assigned To: +Assigned To: nikic Block user comment: N Private report: N New Comment: Fix in 7.4: https://github.com/php/php-src/commit/6255308624a2a6bdbfa8581b9b920a8d180e458f. Previous Comments: ------------------------------------------------------------------------ [2015-10-31 13:53:51] phplists at stanvassilev dot com reeze@php.net: Can you please check the code example again. This is not about respecting or ignoring visibility. method_exists() returns true for a situation where the method simply doesn't exist for the given class. A private method in a superclass *does not exist* in the child class. ------------------------------------------------------------------------ [2015-10-30 15:43:41] reeze@php.net I would say this is not a bug. method_exists() did check for visibility. you could use is_callable() instead. ------------------------------------------------------------------------ [2015-10-26 13:28:19] phplists at stanvassilev dot com Description: ------------ The rules under which a class member is reported to "exist" for method_exists() property_exists() are inconsistent. property_exists will look into all members visible from inside a given class, be it private, public or protected, but it won't report *parent class private properties* as existing for that class. method_exists will report a parent class private method as existing for the child class, but the child class has no access to it internally. This is not a new problem in PHP7, but it's an issue in general. I believe the property_exists() behavior is correct, and method_exists() causes unexpected results. Test script: --------------- class BobSenior { private $a; protected $b; private function a() {} protected function b() {} } class BobJunior extends BobSenior { private $c; protected $d; private function c() {} protected function d() {} } $senior = new BobSenior(); $junior = new BobJunior(); var_dump(property_exists($senior, 'a')); // bool(true) -> EXPECTED var_dump(method_exists($senior, 'a')); // bool(true) -> EXPECTED var_dump(property_exists($senior, 'b')); // bool(true) -> EXPECTED var_dump(method_exists($senior, 'b')); // bool(true) -> EXPECTED var_dump(property_exists($senior, 'c')); // bool(false) -> EXPECTED var_dump(method_exists($senior, 'c')); // bool(false) -> EXPECTED var_dump(property_exists($senior, 'd')); // bool(false) -> EXPECTED var_dump(method_exists($senior, 'd')); // bool(false) -> EXPECTED var_dump(property_exists($junior, 'a')); // bool(false) -> EXPECTED var_dump(method_exists($junior, 'a')); // bool(true) -> *NOT* EXPECTED (EXPECTED = false) var_dump(property_exists($junior, 'b')); // bool(true) -> EXPECTED var_dump(method_exists($junior, 'b')); // bool(true) -> EXPECTED var_dump(property_exists($junior, 'c')); // bool(true) -> EXPECTED var_dump(method_exists($junior, 'c')); // bool(true) -> EXPECTED var_dump(property_exists($junior, 'd')); // bool(true) -> EXPECTED var_dump(method_exists($junior, 'd')); // bool(true) -> EXPECTED Expected result: ---------------- Please check comments for expected results. Actual result: -------------- Please check comments for actual results. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=70791&edit=1

« previous php.bugs (#222539) next »