Bug #74350 [Opn->Nab]: defined() not working for $objectinstance::CLASS_CONSTANT

[email protected]
Newsgroups php.bugs
Message-ID <[email protected]>
Edit report at https://bugs.php.net/bug.php?id=74350&edit=1

 ID:                 74350
 Updated by:         [email protected]
 Reported by:        Andy_Schmidt at HM-Software dot com
 Summary:            defined() not working for
                     $objectinstance::CLASS_CONSTANT
-Status:             Open
+Status:             Not a bug
 Type:               Bug
 Package:            Class/Object related
 Operating System:   Windows
 PHP Version:        7.1.3
 Block user comment: N
 Private report:     N

 New Comment:

The reason you get "not" defined! is because the instance is within single quotes.

Which means it will mean a literal `$object_A` because normal string rules apply.

You can always do:

if ( defined( get_class($object_A) . '::CONST_A' ) )

to get what you want.


Previous Comments:
------------------------------------------------------------------------
[2017-03-31 17:50:06] Andy_Schmidt at HM-Software dot com

Description:
------------
defined() will function correctly for class constants, if either the class name or a classname variable is used.

However, if one tries to check the existence of a constant of the class that was used to instantiate the object, then it will return "not defined".

Test script:
---------------
class Class_A
{
	const CONST_A = 'value A';
	//    CONST_B not defined
}

$class_name = Class_A::class;

$object_A = new $class_name();

// Class references work correctly!
if ( defined( 'Class_A::CONST_A' ) )
	echo 'Class_A::CONST_A defined';

if ( defined( $class_name.'::CONST_A' ) )
	echo '$class_name::CONST_A defined';

if ( !defined( 'Class_A::CONST_B' ) )
	echo 'No Class_A::CONST_B';
		
if ( !defined( $class_name.'::CONST_B' ) )
	echo 'No $class_name::CONST_B';
			

echo $object_A::CONST_A;	// As expected, result: "value A" ! ****

// ***** Yet, using that object reference will report "not" defined! *****
if ( defined( '$object_A::CONST_A' ) )
	echo '$object_A::CONST_A defined !!';
else
	echo 'no $object_A::CONST_A';


// PS: As expected, "Fatal Error: Object of class Class_A could not be converted to string"
if ( defined( "$object_A::CONST_A" ) )
 	echo 'Should cause error, and does';

if ( defined( $object_A.'::CONST_A' ) )
 	echo 'Should cause error, and does';

Expected result:
----------------
Class_A::CONST_A defined
$class_name::CONST_A defined
No Class_A::CONST_B
No $class_name::CONST_B

value A
$object_A::CONST_A defined!!



Actual result:
--------------
Class_A::CONST_A defined
$class_name::CONST_A defined
No Class_A::CONST_B
No $class_name::CONST_B

value A
no $object_A::CONST_A


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=74350&edit=1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.