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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: adam dot huttler at fracturedatlas dot org
New email:
PHP Version: OS:

 

 [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

Pull Requests

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: Fri Dec 27 01:01:28 2024 UTC