Benutzer-Werkzeuge

Webseiten-Werkzeuge


becki:linux:php

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
becki:linux:php [2009-02-09 08:07]
becki
becki:linux:php [2018-01-30 09:02] (aktuell)
becki [Solution]
Zeile 1: Zeile 1:
 ====== PHP == ====== PHP ==
 +===== Server Setup ==
 +
 +See [[:​becki:​linux:​apache httpd]]
 +
 ===== Variables == ===== Variables ==
 ==== var Keyword == ==== var Keyword ==
Zeile 14: Zeile 18:
 ==== predefined stuff == ==== predefined stuff ==
  
-  * %%__FILE__%%:​ The full path and filename of the file, see [[phpman>​language.constants.predefined]] +  * %%__FILE__%%:​ The full path and filename of the file, see [[phpfn>​language.constants.predefined]] 
-  * ''​%%$_SERVER['​PHP_SELF'​]%%'':​ filename of the currently executing script, relative to the document root, see [[phpman>​reserved.variables]]+  * ''​%%$_SERVER['​PHP_SELF'​]%%'':​ filename of the currently executing script, relative to the document root, see [[phpfn>​reserved.variables]]
   * HTTP POST variables: ''​$_POST''​   * HTTP POST variables: ''​$_POST''​
  
 ===== Arrays == ===== Arrays ==
 +
 +[[phpfn>​language.types.array|Arrays]] - [[phpfn>​ref.array|Array Functions]]
 +
 ==== Making of == ==== Making of ==
  
Zeile 28: Zeile 35:
 ); );
 </​code>​ </​code>​
- 
  
 ==== Working with == ==== Working with ==
Zeile 39: Zeile 45:
 </​code>​ </​code>​
  
-==== Copying ​==+==== Value in Stock? ​== 
 + 
 +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. [[phpfn>​function.array-key-exists|More]]
  
-By default, arrays are copied by value: 
 <code php> <code php>
-$a = array ('wespe', ​'​bine',​ '​hummel'​); +array_key_exists('key', ​$fruits)) // returns true if the key exists 
-$b = $a; +isset($fruits['​key'​]) // returns true if the key exists AND value != NULL
-$c = &$a; +
-array_shift($a)// shifts ​the first value of the array off +
-echo "b: "; print_r($b);​ +
-echo "c: "; print_r($c);​+
 </​code>​ </​code>​
  
-Result ​(with PHP5): +==== Copying, Passing and Returning == 
-<​code>​ + 
-b: Array +By default, arrays are copied //by value// ​(Unlike PHP objects and Java arrays and objects): 
-( + 
-    [0] => wespe +=== Assignment == 
-    [1] => bine +<​code ​php
-    [2] => hummel +$a=array(0);​ 
-+ 
-c: Array +$b= $a;  /* Deep copyAssignment by value */ 
-( +$b[0]= 1; 
-    [0] => bine +assert($a[0] == 0); 
-    [1] => hummel + 
-)+$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 $aAgain assignment by value */ 
 +$d[0]= 4; 
 +assert($a[0] == 3); 
 +assert($c[0] == 3);
 </​code>​ </​code>​
  
-===== Command Line Usage ==+=== Passing to and returning from Functions ​==
  
-2004-02-13 14:45+<code php> 
 +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) */
 +</​code>​
 +
 +=== Passing Arrays to Arrays ==
 +
 +<code php>
 +$a= array(0);
 +$b= array('​d'​=>​ $a, '​e'​=>​ &$a);
 +
 +$a[0]= 1;
 +assert($b['​d'​][0] == 0);
 +assert($b['​e'​][0] == 1);
 +</​code>​
 +
 +=== Passing Arrays to Objects ==
 +
 +<note important>​In order to really make an object work with a reference of an arry, you have to //pass// it //by reference// **and** to //assign// it to the member variable //by reference//:</​note>​
 +
 +<code php>
 +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);
 +</​code>​
 +
 +===== Objects ==
 +==== Copying ==
 +
 +Objects are copied by "​something like a reference"​ [[phpfn>​language.oop5.references|more]]. This means the reference operator is not necessary for ojects (anlike PHP arrays)
 +
 +FIXME Add some code to prove this.
 +
 +===== Logging ==
 +
 +Use [[phpfn>​function.error-log|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).
 +
 +===== Command Line Usage ==
 ==== Prerequisites == ==== Prerequisites ==
  
Zeile 77: Zeile 150:
     * Optin -qC is necessary in shebang; therefore use it BY DEFAULT! (-q suppresses header; -C keeps working dir)     * Optin -qC is necessary in shebang; therefore use it BY DEFAULT! (-q suppresses header; -C keeps working dir)
     * set register_argc_argv = On in /​etc/​apache/​php.ini     * set register_argc_argv = On in /​etc/​apache/​php.ini
- 
  
 ==== Command Line Arguments == ==== Command Line Arguments ==
Zeile 83: Zeile 155:
 <code php> <code php>
 #​!/​usr/​bin/​php #​!/​usr/​bin/​php
 +<?php
 echo "​argument count: "​.$_SERVER['​argc'​]."​\n";​ echo "​argument count: "​.$_SERVER['​argc'​]."​\n";​
 foreach ($_SERVER['​argv'​] as $name => $value) { foreach ($_SERVER['​argv'​] as $name => $value) {
     echo "​$name:​ $value\n";​     echo "​$name:​ $value\n";​
 } }
 +?>
 </​code>​ </​code>​
  
Zeile 101: Zeile 175:
 Dont't use $arc and $argv, because they are not available under all circumstances! ​ Dont't use $arc and $argv, because they are not available under all circumstances! ​
  
-===== Standard In- and Output ​== +==== Standard In- and Output ==
-==== stdin ==+
  
-Read stdin line by line into the array lin:+This is only useful for PHP command line scripts, not for webserver scripts. 
 + 
 +=== stdin == 
 + 
 +Read stdin line by line:
 <code php> <code php>
-char lin[MAX_LINE_LEN];​ +while (fgets(STDIN)) {/* do some thing */}
-while (fgets(lin, MAX_LINE_LEN,​ stdin)) {/* do some thing */}+
 </​code>​ </​code>​
  
-==== stdout, stderr =====+=== stdout ==
  
 <code php> <code php>
-printf(); echo; // writing to stdout +printf(); ​ 
-;  // writing to stderr +echo;
-error_log("​Value $val"​);​ // writing to System error log eg. /​var/​log/​apache/​error_log+
 </​code>​ </​code>​
  
 +=== stderr ==
  
 +<code php>
 +/* writing to stderr ​
 +   Note that STDERR seems only to be available when script is called from command line */
 +fputs(STDERR,​ "Some msg!\n"​);​
 +</​code>​
 +
 +See also [[#​logging]]
 +
 +===== Handling own libraries ==
 +==== Requirements ==
 +
 +  - We want to intstall the lib somewhere under ''/​usr/​local/​...''​ to separate it from files of the Linux distribution
 +  - We don't want to interfere with the C libraries in ''/​usr/​local/​lib/''​
 +  - The lib shall be easy to inlcude without the need for an absolute pathname.
 +  - We don't want to tweak the ''​include_path''​ in ''​php.ini''​
 +  - Older code which uses the lib must not break when the API of the lib changes
 +
 +==== Solution ==
 +
 +Example with a self-written PHP library called ''​mystuff'':​
 +
 +  * Install the lib in ''/​usr/​local/​lib/​php/​mystuff0''​. This fulfills 1 and 2
 +  * Make a symlink from a dir which is specified in the PHP ''​include_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
 +
 +<code php phpinfo.php>​
 +<?php phpinfo(); ?>
 +</​code>​
 +
 +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.
  
 ===== Draft: Pages and Actions == ===== Draft: Pages and Actions ==
  
 FIXME Pre- and Postactions are probably obsolete. See http://​skiclub-mitwitz.de/​lib/​libPage/​ FIXME Pre- and Postactions are probably obsolete. See http://​skiclub-mitwitz.de/​lib/​libPage/​
 +
 +See also: [[http://​www.developer.com/​lang/​article.php/​3836561|Build your own MVC Framework]]
  
 ==== Pre-Actions == ==== Pre-Actions ==
Zeile 153: Zeile 271:
 ===== To do == ===== To do ==
  
-  * Check out: [[http://​www.developer.com/​open/​article.php/​10930_3782831|Sending Email with PHP]] +  ​* [[http://​articles.sitepoint.com/​article/​php5-standard-library|Standard PHP Library SPL]] 
-  * Check out: http://www.php.net/autoload+  * Check [[http://​www.developer.com/​lang/​php/​10-pear-packages-for-every-php-developers-toolbox.html|Auth,​ HTML_QuickForm2,​ Text_CAPTCHA,​ Validate]] ​ of Pear 
 +  * Check http://​www.devshed.com/​cp/​bio/​Alejandro-Gervasio/​ 
 +  ​* Check out: [[http://​www.developer.com/​open/​article.php/​10930_3782831|Sending Email with PHP]] and [[http://www.wdvl.com/Authoring/​PHP/​E-mail/​Jason_Gilmore01102010.html|Practical PHP: Sending E-mail]]
   * Check active record pattern for database access   * Check active record pattern for database access
becki/linux/php.1234166872.txt.gz · Zuletzt geändert: 2009-11-13 10:23 (Externe Bearbeitung)

Impressum - Datenschutzerklärung