views:

2643

answers:

4

I have a variable that is built in loop. Something like:

$str = "";
for($i = 0; $i < 10; $i++) $str .= "something";

If $str = "" is ommitted, I get undefined variable notice, but I thought php auto-declare a variable the first time it sees undeclared one?

How do I do this right?

+12  A: 

You get the undefined variable because you're concatenating the value of itself with another value.

The equivalent of

$str = $str . "something";

So, it can't say what's the initial value is. It's the equivalent of this:

$str = [undefined value] . "something";

What's the result of a concatenation of [undefined value] and "something"? The interpreter can't say...

So, you have to put "" in the variable first to initiate the variable's value, as you did.

HTH

vIceBerg
+3  A: 

It's safer to not use the auto-declare feature - that's why it issues a notice. A notice is the lowest level of warning, and won't be displayed by default. Most older PHP apps will issue lots of notices if you were to turn them on.

Greg
+5  A: 

If you really need to make it a it cleaner you could do:

for($i = 0, $str = ''; $i < 10; $i++) $str .= "something";

But what you have is what I normally do. vlceBerg explains it well.

Ross
Just a thought... can you do this:for($i = 0, $str = ''; $i < 10; $i++, $str .= "something"); ? I don't have a PHP box right now to test....
vIceBerg
Apparently yes:zsh % echo '<? for($i = 0, $str = ""; $i < 10; $i++, $str .= "something"); echo $str; ?>' | phpsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomethingsomething
Jonas Due Vesterheden
Yep vlceBerg - you don't even need the loop content. I find it easier to understand using the content but seeing as it's one line you don't need to.
Ross
+1  A: 

PHP variables that are auto-declared are registered as being undefined which is why you're receiving the notice.

It is generally better to declare PHP variables prior to using them though many of the lazy among us, myself included don't always do that.

Noah Goodrich