Comment détecter le système d'exploitation du serveur PHP ?

La constante PHP_OS ou la fonction php_uname permettent de déterminer l'OS.

echo PHP_OS;
// Windows_NT 
// WINNT
// Linux

Comment détecter si PHP est lancé en ligne de commande client (cli) où à travers un serveur web et son module (apache, ...) ?

La constante PHP_SAPI ou la fonction php_sapi_name permettent de déterminer le type d'interface utilisée entre le serveur web et PHP. En PHP CLI, cette chaîne sera "cli" tandis qu'avec Apache, elle pourra avoir plusieurs valeurs différentes.

echo PHP_SAPI;
// En ligne de commande : "php file.php"
// cli
// En mode WEB : "http://localhost/file.php"
// apache2handler

Constantes pré-définies

Grasse aux constantes prédéfinies, on peut utiliser sans connaître les séparateurs de chemin, dossier, fichier, fin de ligne etc...

Constantes prédéfinies Valeur sur Windows (WampServer 2.0) Valeur sur Linux (Debian) Description
PHP_VERSION 5.3.0 5.3.1-0.dotdeb.0 Version de PHP
PHP_OS WINNT Linux Le système d'exploitation (Windows, Linux, ...)
PHP_EOL \r\n \n EndOfLine : Le séparateur de fin de ligne
DIRECTORY_SEPARATOR \ / Le séparateur de dossiers
PATH_SEPARATOR ; : Le séparateur de dossiers à inclure (include_path)

Voyez aussi Les constantes PHP PHP_OS et PHP_EOL qui font partie des constantes pré-définies dans le cœur de PHP.

Et pour connaître toutes les constantes pré-définies sur votre serveur php, utilisez la fonction get_defined_constants().

Identiquement on peut lister les fonctions prédéfinies (internal) et que l'on a créer soi (user) de PHP avec get_defined_functions() et les variables déclarées (dans le contexte ou portée) avec get_defined_vars()

print_r(get_defined_constants());
print_r(get_defined_functions());
print_r(get_defined_vars());

Par contre, il est impossible de lister les constantes de vos classes, selon l'exemple Get the value of a PHP constant dynamically on peut rechercher si elle est définie :

if(defined(self::MA_CONST)) {

Pour obtenir la liste de vos constantes de classes vous devrez ajouter une méthode dans vos classes comme l'indique php.net

public function get_class_constants()
	{
	    $reflect = new ReflectionClass(get_class($this));
	    return $reflect->getConstants();
	}

Illustration pour connaitre les attributs possibles de la classe PDO déclaré dans ses constantes :

class PdoExtend extends PDO {
	static public function get_class_constants()
	{
		$reflect = new ReflectionClass(get_class());
		return $reflect->getConstants();
	}
}
$constantesPdo = PdoExtend::get_class_constants();
echo "PDO class : -----------------------------------------------------------------------------\n";
foreach( $constantesPdo as $constName => $constValue ) {
	if( preg_match('/ATTR_/', $constName) ) {
		echo $constName . " : constValue : ";
		try {
			var_dump($constValue);
		} catch (Exception $e) {
			echo "Exception : " . $e->getMessage() . "\n";
		}	
	}
}
 
//var_dump(PdoSql::getInstance()->setAttribute(PDO::ATTR_TIMEOUT,3 ));
//var_dump(PdoSql::getInstance()->getAttribute(PDO::ATTR_TIMEOUT ));	// SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
 
echo "PDO instancié : -----------------------------------------------------------------------------\n";
foreach( $constantesPdo as $constName => $constValue ) {
	if( preg_match('/ATTR_/', $constName) ) {
		echo $constName . " : ";
		try {
			$constValue = PdoSql::getInstance()->getAttribute($constValue);
			var_dump($constValue);
		} catch (Exception $e) {
			echo "Exception : " . $e->getMessage() . "\n";
		}
	}
 
}
 
// Avec une connexion paramétrées avec ces options
//				$pdo_sql_options = array(
//				PDO::ATTR_TIMEOUT => 3 ,
//				PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
//				PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'	// en remplacement de : self::$instance->exec("SET NAMES 'utf8'");
//				//									PDO::ATTR_PERSISTENT => true						// Table 'tmp' already exists' => Ajout de : DROP TABLE IF EXISTS
//				);
//				self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
// Le résultat est le suivant
//PDO class : -----------------------------------------------------------------------------
//ATTR_AUTOCOMMIT : constValue : int(0)
//ATTR_PREFETCH : constValue : int(1)
//ATTR_TIMEOUT : constValue : int(2)
//ATTR_ERRMODE : constValue : int(3)
//ATTR_SERVER_VERSION : constValue : int(4)
//ATTR_CLIENT_VERSION : constValue : int(5)
//ATTR_SERVER_INFO : constValue : int(6)
//ATTR_CONNECTION_STATUS : constValue : int(7)
//ATTR_CASE : constValue : int(8)
//ATTR_CURSOR_NAME : constValue : int(9)
//ATTR_CURSOR : constValue : int(10)
//ATTR_ORACLE_NULLS : constValue : int(11)
//ATTR_PERSISTENT : constValue : int(12)
//ATTR_STATEMENT_CLASS : constValue : int(13)
//ATTR_FETCH_TABLE_NAMES : constValue : int(14)
//ATTR_FETCH_CATALOG_NAMES : constValue : int(15)
//ATTR_DRIVER_NAME : constValue : int(16)
//ATTR_STRINGIFY_FETCHES : constValue : int(17)
//ATTR_MAX_COLUMN_LEN : constValue : int(18)
//ATTR_EMULATE_PREPARES : constValue : int(20)
//ATTR_DEFAULT_FETCH_MODE : constValue : int(19)
//MYSQL_ATTR_USE_BUFFERED_QUERY : constValue : int(1000)
//MYSQL_ATTR_LOCAL_INFILE : constValue : int(1001)
//MYSQL_ATTR_INIT_COMMAND : constValue : int(1002)
//MYSQL_ATTR_DIRECT_QUERY : constValue : int(1003)
//MYSQL_ATTR_FOUND_ROWS : constValue : int(1004)
//MYSQL_ATTR_IGNORE_SPACE : constValue : int(1005)
//ODBC_ATTR_USE_CURSOR_LIBRARY : constValue : int(1000)
//ODBC_ATTR_ASSUME_UTF8 : constValue : int(1001)
//PDO instancié : -----------------------------------------------------------------------------
//ATTR_AUTOCOMMIT : int(1)
//ATTR_PREFETCH : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_TIMEOUT : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_ERRMODE : int(2)
//ATTR_SERVER_VERSION : string(21) "5.1.51-0.dotdeb.1-log"
//ATTR_CLIENT_VERSION : string(48) "mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $"
//ATTR_SERVER_INFO : string(147) "Uptime: 192729  Threads: 2  Questions: 5231025  Slow queries: 9478  Opens: 570986  Flush tables: 1  Open tables: 64  Queries per second avg: 27.141"
//ATTR_CONNECTION_STATUS : string(24) "mysql.placeoweb.com via TCP/IP"
//ATTR_CASE : int(0)
//ATTR_CURSOR_NAME : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_CURSOR : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_ORACLE_NULLS : int(0)
//ATTR_PERSISTENT : bool(false)
//ATTR_STATEMENT_CLASS : array(1) {
//  [0]=>
//  string(12) "PDOStatement"
//}
//ATTR_FETCH_TABLE_NAMES : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_FETCH_CATALOG_NAMES : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_DRIVER_NAME : string(5) "mysql"
//ATTR_STRINGIFY_FETCHES : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_MAX_COLUMN_LEN : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_EMULATE_PREPARES : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ATTR_DEFAULT_FETCH_MODE : int(4)
//MYSQL_ATTR_USE_BUFFERED_QUERY : int(1)
//MYSQL_ATTR_LOCAL_INFILE : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//MYSQL_ATTR_INIT_COMMAND : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//MYSQL_ATTR_DIRECT_QUERY : int(1)
//MYSQL_ATTR_FOUND_ROWS : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//MYSQL_ATTR_IGNORE_SPACE : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute
//ODBC_ATTR_USE_CURSOR_LIBRARY : int(1)
//ODBC_ATTR_ASSUME_UTF8 : Exception : SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute

Constantes magiques

  • __LINE__ La ligne courante dans le fichier.
  • __FILE__ Le chemin complet et le nom du fichier courant.
  • __DIR__ Le dossier du fichier.
  • __FUNCTION__ Le nom de la fonction.
  • __CLASS__ Le nom de la classe courante.
  • __METHOD__ Le nom de la méthode courante.
  • __NAMESPACE__ Le nom de l'espace de noms courant.

Différence entre ::, ->, self et. $this

Pour les gens qui confondent la différence entre :: et -> ou self et $this, Je vous présentes les règles :

  • Si la variable ou la méthode référencée est déclarée en tant const ou static vous devez utiliser l'opérateur ::
  • Si la variable ou la méthode référencée n'est pas déclarée en tant const ou static vous devez utiliser l'opérateur ->
  • Si vous accédez à une variable const ou static variable / méthode dans une classe, vous devez utiliser la référence self
  • Si vous accédez à une variable ou méthode qui n'est ni const ni static, vous devez utiliser la référence $this

Plus d'information sur les classes php :

  • Les classes et les objets
    • Propriétés Au sein des méthodes de classes, les propriétés, constantes et méthodes peuvent être appellées en utilisant la forme $this->property (où property est le nom de la propriété), à moins que l'appel se fasse sur une propriété statique dans une méthode de classe statique, auquel cas l'accès se fait en utilisant la forme self::$property.
    • Constantes de classe Définir des valeurs constantes à l'intérieur d'une classe. Depuis PHP 5.3.0, il est possible de référencer une classe en utilisant une variable. La valeur de la variable ne peut être un mot-clé (e.g. self, parent et static).
    • Statique Si aucune déclaration de visibilité (public, protected ou private) n'est spécifiée, alors la propriété ou la méthode sera automatiquement spécifiée comme public.
    • L'opérateur de résolution de portée (::) Deux mots-clé spéciaux, self et parent, sont utilisés pour accéder aux propriétés ou aux méthodes depuis la définition de la classe.
    • Méthodes magiques Les méthodes __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state et __clone sont magiques en PHP.

Ressources