php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #42355 can't concatenate when defining class constant
Submitted: 2007-08-20 22:18 UTC Modified: 2014-01-23 07:58 UTC
From: adam dot huttler at fracturedatlas dot org Assigned: nikic (profile)
Status: Closed Package: Class/Object related
PHP Version: 5.2.3 OS: Linux
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please !
Your email address:
MUST BE VALID
Solve the problem:
46 + 28 = ?
Subscribe to this entry?

 
 [2007-08-20 22:18 UTC] adam dot huttler at fracturedatlas dot org
Description:
------------
When defining a global constant, you can concatenate a string to another constant. Doing this with class constants causes a parse error.

If this isn't considered a bug, please consider it a feature request, as it would be very useful for configuration (especially file paths).

Thanks.

Reproduce code:
---------------
define('FOO', 'foo'); 

class Foobar 
{ 
    const MESSAGE = FOO . 'bar'; 
}

echo Foobar::MESSAGE;

Expected result:
----------------
foobar

Actual result:
--------------
Parse error: syntax error, unexpected '.', expecting ',' or ';'

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-08-21 06:22 UTC] derick@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

You can only initialize class constants with constant values. You pass a statement which has to be evaluated at runtime, while the class constants are defined at compile time which comes earlier.
 [2007-08-21 10:26 UTC] adam dot huttler at fracturedatlas dot org
Thanks for the reply. I suspected this would be marked bogus, since the behavior is consistent with how object properties need to be initialized, etc.

Can this be considered a feature request? I do understand the runtime/compile time challenge. But it seems like there may be ways around it (e.g. late static binding is getting addressed).
 [2011-02-06 10:54 UTC] dirarck at gmail dot com
Maybe a solution for this issue could be using defined constants, something like 
this:

[ START ]

define('ROOT_DIR', dirname('..' . Constants::DS));
define('ACTIONS_DIRECTORY', APPLICATION_PATH . Constants::DS . 'actions' . 
Constants::DS);
define('VIEWS_DIRECTORY', APPLICATION_PATH . Constants::DS . 'views' . 
Constants::DS);

class Constants {
	const ROOT_DIR = ROOT_DIR;
	const DS = DIRECTORY_SEPARATOR;
	const ACTIONS_DIRECTORY = ACTIONS_DIRECTORY;
	const VIEWS_DIRECTORY = VIEWS_DIRECTORY;
}

[ END ]

Sorry by my poor english, maybe someone could correct me...
 [2014-01-23 07:10 UTC] sdeonline at gmail dot com
Please re-check, the behaviour is inconsistent.

is inconsistent between global consts and class const.
And is inconsistent between class const definition itself.

[2007-08-21 06:22 UTC] derick@php.net said:

"You can only initialize class constants with constant values. You pass a statement which has to be evaluated at runtime, while the class constants are defined at compile time which comes earlier."

Then, it seems that something goes wrong, as I can't assign a class const to a statement but I can assign it to a const which has an statement... Which, by transitive properties :) I'm assigning an statement to it...

[ START ]

define('STATEMENT', 'hello' . 'world';

class Constants {
	const WORKS = STATEMENT; // works.
	const FAILS = 'hello' . 'world'; // fails.
}

[ END ]
 [2014-01-23 07:17 UTC] sdeonline at gmail dot com
Additional tests, try this, according to runtime/compile blah blah, should this work? Please raise these to a feature request.

<?php

define('HELLO_WORLD', Constants::HELLO . Constants::WORLD);

class Constants {
  const HELLO = 'Hello ';
  const WORLD = 'world.';
  const HELLO_WORLD = HELLO_WORLD;
}

echo Constants::HELLO_WORLD;
 [2014-01-23 07:58 UTC] nikic@php.net
-Status: Not a bug +Status: Closed -Assigned To: +Assigned To: nikic
 [2014-01-23 07:58 UTC] nikic@php.net
@sdeonline: This has been implemented for PHP 5.6, see https://wiki.php.net/rfc/const_scalar_exprs.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Apr 23 09:01:27 2024 UTC