Академический Документы
Профессиональный Документы
Культура Документы
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) .
DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
Implementao da SplClassLoader
O seguinte gist uma implementao da SplClassLoader que carrega suas
classes se voc seguir as propostas de interoperabilidade de
autocarregamento citadas acima. Atualmente, a forma recomendada para
carregar classes de PHP 5.3 que seguem estes padres.
http://gist.github.com/221634
PSR-1
2. Arquivos
2.1. Tags PHP
Cdigo PHP deve usar as tags longas <?php ?> ou a short-tags para
echo <?= ?>; no deve se utilizar outras tags.
2.2. Codificao de caracteres
Cdigo PHP deve usar apenas UTF-8 sem BOM.
2.3. Efeitos secundrios
Ou o arquivo declara classes, funes, constantes, ou o arquivo
executa lgica e outros efeitos, mas nunca ambos.
Um arquivo deve declarar novos smbolos (classes, funes, contantes, etc.)
e no causar outros efeitos, ou ele deve executar lgica com outros efeitos,
mas no deve fazer ambos.
A expresso "efeitos secundrios" significa a execuo da lgica no
diretamente ligada com declarao de classes, funes, constantes, etc,
apenas de incluir o arquivo.
"Efeitos secundrios" incluem, mas no esto limitados a: A gerao do
output, uso explcito de require ou include, conexo a servios externos,
modificao de configuraes ini, emisso erros ou excees, modificao
das variveis globais ou estticas, ler ou escrever em um arquivo, e assim
por diante.
// declarao
function foo()
{
// corpo da funo
}
A seguir est um exemplo de um arquivo, com declaraes sem efeitos
secundrios; um exemplo do que deve ser feito:
<?php
// declarao
function foo()
{
// corpo da funo
}
Por exemplo:
<?php
// PHP 5.3 e superior:
namespace Vendor\Model;
class Foo
{
}
Cdigo escrito para PHP 5.2.x ou inferior deve utilizar a conveno pseudo-
namespace do Vendor_ prefixando nos nomes das classes.
<?php
// PHP 5.2.x e inferior:
class Vendor_Model_Foo
{
}
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
4.2. Propriedades
Este guia intencionalmente evita qualquer recomendao sobre o uso
de $StudlyCaps, $camelCase, ou $under_score em nomes de propriedades.
Seja qual for conveno de nomenclatura usada, ela deve ser aplicada de
forma consistente dentro de um escopo razovel. Esse escopo pode ser a
nvel de fornecedor, pacote, classe ou mtodo.
4.3. Mtodos
Mtodos devem ser declarados em camelCase().
PSR-2
Guia de estilo de cdigo
Este guia estende e expande sobre a PSR-1, os padres bsicos de
codificao.
1. Viso geral
Cdigo deve seguir a PSR-1.
1.1. Exemplo
Este exemplo engloba algumas das regras abaixo como uma viso
geral:
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
2.2 Arquivos
Todos os arquivos PHP deve usar o fim da linha Unix LF (linefeed).
2.4. Indentao
Cdigo deve usar uma identao de 4 espacos, e no deve usar tabs
para identao.
Por exemplo:
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
4.2. Propriedades
Visibilidade deve ser declarada em todas as propriedades.
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
4.3. Mtodos
Visibilidade deve ser declarada em todos os mtodos.
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// corpo do mtodo
}
}
<?php
namespace Vendor\Package;
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// corpo do mtodo
}
}
<?php
namespace Vendor\Package;
class ClassName
{
public function umNomeDeMetodoMuitoLongo(
ClassTypeHint $arg1,
&$arg2,
array $arg3 = []
){
// corpo do mtodo
}
}
<?php
namespace Vendor\Package;
<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
5. Estruturas de controle
As regras gerais de estilo para estruturas de controle so as
seguintes:
<?php
if ($expr1) {
// if corpo
} elseif ($expr2) {
// elseif corpo
} else {
// else corpo;
}
<?php
switch ($expr) {
case 0:
echo 'Primeiro caso, com uma quebra';
break;
case 1:
echo 'Segundo caso, sem uma quebra, continuando para o(s) caso(s)
seguintes';
// no break
case 2:
case 3:
case 4:
echo 'Quarto caso, return usado para fazer a quebra ao invs de break';
return;
default:
echo 'Caso padro';
break;
}
<?php
while ($expr) {
// estrutura
}
<?php
do {
// estrutura;
} while ($expr);
5.4. for
Uma estrutura for se parece com o seguinte. Note a posio dos
parnteses, espaos e chaves.
<?php
for ($i = 0; $i < 10; $i++) {
// for corpo
}
5.5. foreach
Uma estrutura foreach se parece com o seguinte. Note a posio dos
parnteses, espaos e chaves.
<?php
foreach ($iterable as $key => $value) {
// foreach corpo
}
<?php
try {
// try corpo
} catch (FirstExceptionType $e) {
// catch corpo
} catch (OtherExceptionType $e) {
// catch corpo
}
6. Closures
Closures devem ser declaradas com um espao depois da palavra-
chave function e um espao antes e depois da palavra-chave use.
<?php
$closureWithArgs = function ($arg1, $arg2) {
// corpo
};
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
){
// corpo
};
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// corpo
};
<?php
$foo->bar(
$arg1,
function ($arg2) use ($var1) {
// corpo
},
$arg3
);
7. Concluso
H muitos elementos de estilo e prticas intencionalmente omitidos
por este guia. Estes incluem, mas no esto limitados para:
Declarao de funes
Operadores e atribuio
Boas prticas
PSR-3: Logger
Interface
Este documento descrve uma interface comum para
bibliotecas de Logging.
Especificao
1.1 Basics
1.2 Message
Cada mtodo aceita uma string como mensagem, ou um
objeto com o mtodo __toString() .
Implementadores podem ter manipulao especial para os
objetos passados. Se esse no for o caso, os implementadores
devem mold-lo para uma string.
A mensagem pode conter placeholders que os
implementadores podem substituir com valores da array de
contexto.
/**
* Interpolates context values into the message placeholders.
*/
function interpolate($message, array $context = array())
{
// criar uma matriz de substituio com chaves em torno das chaves de
contexto
$replace = array();
foreach ($context as $key => $val) {
1.3 Context
Cada mtodo aceita uma matriz como dados
de contexto. Isso para manter qualquer
informao estranha que no se encaixa bem
em uma string. A matriz pode conter qualquer
coisa. Os implementadores DEVEM assegurar
que tratam os dados de contexto com a maior
clareza possvel. Um dado valor no contexto
no deve lanar uma exceo nem levantar
qualquer php erro, noticia ou aviso.
Package
As interfaces e classes descritas, bem como as classes de
exceo relevantes e um conjunto de testes para verificar sua
implementao so fornecidos como parte do pacote psr / log.
Psr\Log\LoggerInterface
<?php
namespace Psr\Log;.
/**
* Action must be taken immediately.
*
* Example: Entire website down, database unavailable, etc. This should
* trigger the SMS alerts and wake you up.
*
* @param string $message
* @param array $context
* @return null
*/
public function alert($message, array $context = array());
/**
* Critical conditions.
*
* Example: Application component unavailable, unexpected exception.
*
* @param string $message
* @param array $context
* @return null
*/
public function critical($message, array $context = array());
/**
* Runtime errors that do not require immediate action but should
typically
* be logged and monitored.
*
* @param string $message
* @param array $context
* @return null
*/
public function error($message, array $context = array());
/**
* Exceptional occurrences that are not errors.
*
* Example: Use of deprecated APIs, poor use of an API, undesirable things
* that are not necessarily wrong.
*
* @param string $message
* @param array $context
* @return null
*/
public function warning($message, array $context = array());
/**
* Normal but significant events.
*
* @param string $message
* @param array $context
* @return null
*/
public function notice($message, array $context = array());
/**
* Interesting events.
*
* Example: User logs in, SQL logs.
*
* @param string $message
* @param array $context
* @return null
*/
public function info($message, array $context = array());
/**
* Detailed debug information.
*
* @param string $message
* @param array $context
* @return null
*/
public function debug($message, array $context = array());
/**
* Logs with an arbitrary level.
*
* @param mixed $level
* @param string $message
* @param array $context
* @return null
*/
public function log($level, $message, array $context = array());
}
Psr\Log\LoggerAwareInterface
<?php
namespace Psr\Log;
/**
* Describes a logger-aware instance
*/
interface LoggerAwareInterface
{
/**
* Sets a logger instance on the object
*
* @param LoggerInterface $logger
* @return null
*/
public function setLogger(LoggerInterface $logger);
}
Psr\Log\LogLevel
<?php
namespace Psr\Log;
/**
* Describes log levels
*/
class LogLevel
{
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
}