用户评论:
[#1]
Kubo2 [2015-03-22 12:05:41]
What's funny with PHP's $this variable and variable variables:
Imagine you have a class like below:
private$foo=9;
function__construct() {$varName='this';
$$varName='text';// sets $this to 'text'
// outputs 'text'echo$this;// instead of Notice: Trying to get property of non-object, outputs 9echo$this->foo;
}
}$a= newBar;var_dump($a);// object(Bar)#1 (1) {...}?>
So PHP doesn't rely on $this's value itself, but rather on its name and the syntax you're accessing instance's properties and calling its methods. Also it doesn't pass any hidden parameter $this to the instance's methods nor it automatically returns $this from the __construct()or, like often being described in books which tries to teach OOP.
$this is simply an undefined variable with special meaning of its name.
[#2]
karst at onlinq dot nl [2014-11-17 11:34:02]
From the "Properties" page, about initialising properties:
"This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated. "
So if you define a variable in a class (as a member variable/property), things like public <?php $test = 2+3; ?> are invalid, because logic has to be performed on the right hand side.
It HAS to be either a constant, or a scalar value (int/string/bool/float). Not even another variable which is a constant (so <?php public $test = "test"; public $invalid = $test; ?> would not work.
Just thought this should be mentioned here for all those like me who get here before getting to the "Properties" page.
[#3]
jeff12 at fastpitchcentral dot com [2014-03-20 19:38:01]
While the recommendation here is to initialize variables, there is a very good reason to definitely initialize variables.
I just had the unpleasant task of making numerous folks happy that the Apache "error_log" is now much smaller. We had over 1500 variables that showed up as "error" in the error_log file. In many cases just one uninitialized variable might cause 10s or 100s of thousands of records to be entered in the "error_log".
While it may not be necessary to initialize variables, there can be a significant cost if you do not do so.
And no, that website was not willing to lower the bar and not write to the "error_log" file if it was simply a case of uninitialized variables. It was also the case that in a small percentage of cases the variables newly initialized caused me to scratch my head and conclude that a blank or zero might cause different logic to occur.
[#4]
tymac at hotmail dot com [2013-09-19 04:05:31]
Hi,
something like $foo = &myfunc(); seems to work fine.
Regards.
[#5]
php at richardneill dot org [2013-08-26 01:05:49]
Note that "$1" is not a variable name. PHP treats it literally, even when it is in double quotes. Eg:
$fruit="apple";
echo "This $fruit costs $1 ";
This is especially notable when using $1, $2 etc inside parameterised queries in SQL.
[#6]
megan at voices dot com [2012-01-05 08:44:42]
"Note: $this is a special variable that can't be assigned."
While the PHP runtime generates an error if you directly assign $this in code, it doesn't for $$name when name is 'this'.
$this='text';// error$name='this';
$$name='text';// sets $this to 'text'?>
[#7]
maurizio dot domba at pu dot t-com dot hr [2011-01-21 02:23:57]
If you need to check user entered value for a proper PHP variable naming convention you need to add ^ to the above regular expression so that the regular expression should be '^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'.
Example
$name="20011aa";
if(!preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/',$name))
echo$name.' is not a valid PHP variable name';
else
echo$name.' is valid PHP variable name';?>
Outputs: 2011aa is valid PHP variable name
but
$name="20011aa";
if(!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/',$name))
echo$name.' is not a valid PHP variable name';
else
echo$name.' is valid PHP variable name';?>
Outputs: 2011aa is not a valid PHP variable name
[#8]
jeff dot phpnet at tanasity dot com [2010-09-11 16:11:10]
This page should include a note on variable lifecycle:
Before a variable is used, it has no existence. It is unset. It is possible to check if a variable doesn't exist by using isset(). This returns true provided the variable exists and isn't set to null. With the exception of null, the value a variable holds plays no part in determining whether a variable is set.
Setting an existing variable to null is a way of unsetting a variable. Another way is variables may be destroyed by using the unset() construct.
is_null() is an equivalent test to checking that isset() is false.
The first time that a variable is used in a scope, it's automatically created. After this isset is true. At the point at which it is created it also receives a type according to the context.
$a_bool=true;// a boolean$a_str='foo';// a string?>
If it is used without having been given a value then it is uninitalized and it receives the default value for the type. The default values are the _empty_ values. E.g Booleans default to FALSE, integers and floats default to zero, strings to the empty string '', arrays to the empty array.
A variable can be tested for emptiness using empty();
$a=0;//This isset, but is empty?>
Unset variables are also empty.
Everything above applies to array elements too.
$item= array();//Now isset($item) returns true. But isset($item['unicorn']) is false.
//empty($item) is true, and so is empty($item['unicorn']$item['unicorn'] ='';//Now isset($item['unicorn']) is true. And empty($item) is false.
//But empty($item['unicorn']) is still true;$item['unicorn'] ='Pink unicorn';//isset($item['unicorn']) is still true. And empty($item) is still false.
//But now empty($item['unicorn']) is false;?>
For arrays, this is important because accessing a non-existent array item can trigger errors; you may want to test arrays and array items for existence with isset before using them.
[#9]
Edoxile [2010-03-06 13:25:25]
When wanting to switch two variables from content, you can use the XOR operator:
$a=5;$b=3;//Please mind the order of these, as it's important for the outcome.$a^=$b;$b^=$a;$a^=$b;
echo$a.PHP_EOL.$b;?>
This will also work on strings, but it won't work on arrays and objects, so for them you'll have to use the serialize() function before the operation, and the unserialize() function after.