var
was the keyword for defining a member variable within a class. Since php5 it should never appear anywhere.
For hashtables use this syntax:
echo "A banana is {$fruits['banana']}.";
$_SERVER['PHP_SELF']
: filename of the currently executing script, relative to the document root, see reserved.variables$_POST
$fruits = array ( "fruits" => array ("a"=>"orange", "b"=>"banana", "c"=>"apple"), "numbers" => array (1, 2, 3, 4, 5, 6), "holes" => array ("first", 5 => "second", "third") );
foreach ($fruits as $fruit) {...} // traverse the array foreach ($fruits as $key => $fruit) {...} // same if indices are needed $length= count($fruits); // get number of items print_r($fruits); // print content
Access to a nonexisting key generates a PHP notice. To prevent this, you can check before the access if the key exists or if the value is set. More
array_key_exists('key', $fruits)) // returns true if the key exists isset($fruits['key']) // returns true if the key exists AND value != NULL
By default, arrays are copied by value (Unlike PHP objects and Java arrays and objects):
$a=array(0); $b= $a; /* Deep copy: Assignment by value */ $b[0]= 1; assert($a[0] == 0); $c= &$a; /* Shallow copy: Assignment by reference */ $c[0]= 2; assert($a[0] == 2); $a[0]= 3; assert($c[0] == 3); $d= $c; /* $c is not different from $a: Again assignment by value */ $d[0]= 4; assert($a[0] == 3); assert($c[0] == 3);
function f($v) { $v[0]= 1; } function g(&$w) { $w[0]= 2; } function h(&$x) { $x[0]= 3; return $x; } $a= array(0); f($a); /* pass-by-value */ assert($a[0] == 0); f(&$a); /* Call-time pass-by-reference works, but is deprecated! */ assert($a[0] == 1); g($a); /* pass-by-reference */ assert($a[0] == 2); $b= h($a); /* return-by-reference seems to be default */ assert($a[0] == 3); /* (pass-by-reference just to make it verifiable) */
$a= array(0); $b= array('d'=> $a, 'e'=> &$a); $a[0]= 1; assert($b['d'][0] == 0); assert($b['e'][0] == 1);
class C { public function f(&$v) { $this->v= $v; $this->v[0]= 1; } public function g(&$w) { $this->w= &$w; $this->w[0]= 2; } } $o= new C(); $a= array(0); $o->f($a); assert($a[0] == 0); $o->g($a); assert($a[0] == 2);
Objects are copied by „something like a reference“ more. This means the reference operator is not necessary for ojects (anlike PHP arrays)
Add some code to prove this.
Use error_log() for debug logging.
If the calling PHP script is run by the web server, the output usually goes to /var/log/httpd/error_log
whereas if if the script is called from the command line, the output goes to stderr
(tested).
#!/usr/bin/php <?php echo "argument count: ".$_SERVER['argc']."\n"; foreach ($_SERVER['argv'] as $name => $value) { echo "$name: $value\n"; } ?>
Script saved as tester
and called with tester bee fly
prints:
argument count: 3 0: /home/becki/bin/tester 1: bee 2: fly
argv[0] = name of script
Dont't use $arc and $argv, because they are not available under all circumstances!
This is only useful for PHP command line scripts, not for webserver scripts.
Read stdin line by line:
while (fgets(STDIN)) {/* do some thing */}
printf(); echo;
/* writing to stderr Note that STDERR seems only to be available when script is called from command line */ fputs(STDERR, "Some msg!\n");
See also logging
/usr/local/…
to separate it from files of the Linux distribution/usr/local/lib/
include_path
in php.ini
Example with a self-written PHP library called mystuff
:
/usr/local/lib/php/mystuff0
. This fulfills 1 and 2include_path
to the real lib, eg: /usr/lib/php/mystuff0 → /usr/local/lib/php/mystuff0
. To find out what the include_path
is, use phpinfo()
. This fulfills requirement #3 and #4<?php phpinfo(); ?>
The number appendix specifies the API version of the lib. When the API of the lib changes, then the version number must be increased. This is the case when exported functions are removed, when their behavior changes or when the signature of the function changes. Note that adding more functions (or classes) to the lib do not break the API.
With every new API you have to install a new lib and keep the older ones:
/usr/lib/php/mystuff0 -> /usr/local/lib/php/mystuff0 /usr/lib/php/mystuff1 -> /usr/local/lib/php/mystuff1 /usr/lib/php/mystuff2 -> /usr/local/lib/php/mystuff2
It should be ovious that you should avoid to change the API too often!
Note that in C you need not to specify a version number. This is resolved by the linker which seems to automatically write a reference to the newest lib into the binary at compile time.
Pre- and Postactions are probably obsolete. See http://skiclub-mitwitz.de/lib/libPage/
See also: Build your own MVC Framework
This section is in progress