PHP – Função com número de parâmetros indefinido

Para criar uma função que recebe um número variável de parâmetros precisaremos conhecer as funções built-in do PHP, func_num_args, func_get_args, e func_get_arg.

– func_num_args() – Retorna a quantidade de argumentos passados para a função
– func_get_args() – Retorna array de argumentos passados para a função
– func_get_arg(int $pos) – Retorna o argumento da posição informada
 
Exemplo:
 
function hello() {
	if (func_num_args() > 0) {
		$args = func_get_args();
		foreach($args as $arg){
			echo $arg;
		}
	} else {
		echo "Você não passou nenhum param";
	}
}
hello("andafter",".","org"); // Aparecerá "andafter.org"
hello(); // Aparecerá "Você não passou nenhum param" 

PHP, escovando bits

– "&" – Porta Lógica AND

Tabela da Verdade: 

A B A & B
0 0 0
0 1 0
1 0 0
1 1 1

 

Código: 

$a = 1;

$b = 0;

if($a & $b){

echo "Teste AND: true";

}else{

echo "Teste AND: false";

}

?>

Obs: Só será true se os valores de A e B forem 1

 

– "|" – Porta lógica OR

Tabela da Verdade: 

A B A | B
0 0 0
0 1 1
1 0 1
1 1 1

 

Código: 

$a = 1;

$b = 0;

if($a | $b){

echo "Teste OR: true";

}else{

echo "Teste OR: false";

}

?>

Obs: Só será true se os valores de A ou B ou ambos for(em) 1

 

– "^" – Porta lógica XOR

Tabela da verdade:

 
A B A ^ B
0 0 0
0 1 1
1 0 1
1 1 0

 

 

Código: 

$a = 1;

$b = 0;

if($a ^ $b){

echo "Teste XOR: true";

}else{

echo "Teste XOR: false";

}

?>

Obs: Só será true se o valor de A for o contrário de B e vice e versa.

 

– "~" – Porta lógica NOT

Tabela da verdade:

A ~A
0 1
1 0

Obs: O negado é o inverso do valor de A.

 

– ">>" – Move os bits para a direita

$num = 8; //Em binario, 1000

$num = $num >> 2; 

echo $num; //Aparecerá 2 que em binário = 0010

?>

 

 

– "<<" – Move os bits para a esquerda

$num = 2; //Em binario, 0010

$num = $num << 2; 

echo $num; //Aparecerá 8 que em binário = 1000

?>

Ponteiros, as variáveis de referência

Primeiramente precisamos entender o que é uma variável, então o que é? 

Variável é um nome amigável que damos para um espaço reservado na memória que receberá alguma informação que desejamos. Exemplo: 
 
$nome = "Andafter.org";
?>
 
Este trecho de código diz ao compilador do php o seguinte: Memória, reserve pra mim um espaço em sua memória e guarde dentro dele a string "Andafter.org". Quando pedimos isso, o computador executa essas ações e retorna um endereço que este espaço ficou alocado, o endereço de memória.
 
Sabendo agora o que é um endereço de memória, vejamos o código abaixo: 
 
$nome = "google.com"; 
$linkNome = &$nome;
$linkNome = "andafter.org";
 
echo $nome; //aparecerá andafter.org
?>
 
Na 1a linha de código temos uma associação normal, conforme vimos anteriormente.
na 2a linha de código falamos que $linkNome receberá o endereço de memória da variável $nome, ou seja, $linkNome será um ponteiro para a var $nome.
Na 3a linha modificamos a var $linkNome que na verdade é uma referência a variável $nome alterando assim o conteúdo da variável que está apontando.

Onde usar ponteiros? 

Ponteiros são usados juntos com funções, sendo estes em forma de parâmetros ou em retornos.
Exemplo:
 
$frutas = ["maça","pera","abacate"];
 
sort($frutas);
 
var_dump($frutas);
?>
 
A função sort, que ordena um array, recebe uma referência de variável e faz a modificação a partir da referência informada.
Veja a assinatura do método sort: 
 
bool sort ( array &$array [, int $sort_flags ] ) 

Porque usar ponteiros?

Os ponteiros evitam cópias desnecessárias para os escopos locais das funções. Toda vez que uma função recebe um parâmetro, ela mesma cria uma cópia da variável em memória para trabalhar dentro de si mesma, veja nos exemplos abaixo:
 
Exemplo 1: variáveis duplicadas em memória: 
 
 
function dobraValor($valor){
        return $valor * 2;
}
 
$valor = 2;
 
$valor = dobraValor($valor);
?>
 
Explicação: Neste exemplo teremos 2 variáveis $valor; uma de escopo global e uma de escopo local dentro da função ambas contendo o mesmo conteúdo.
 
Exemplo 2: uma variável e trabalhando com referência
 
 
function dobraValor(&$valor){
        $valor = $valor * 2;
}
 
$valor = 2;
 
dobraValor($valor);
?> 
 
Explicação: Neste caso, temos apenas 1 variável $valor, a de escopo global. A função dobraValor recebe apenas uma referência à variável de escopo global não criando portanto uma cópia da $valor para acesso local.

Conclusão

Deixamos mais performáticos nossos sitemas trabalhando com ponteiros mas também devemos tomar cuidado ao modificar essas variáveis por referência pois qualquer atribuição de valor a ela, modificaremos a variável de fora também o que pode gerar muita dor de cabeça na hora identificar o porque a variável está dobrando o valor sem vc. mandar. 

XAMP e MySQL no Mac – XAMPPErrorDomain error

Como tenho pouca experiência com Mac OS, quem configurou meu ambiente de desenvolvimento foi meu colega Well, que optoiu pelo XAMPP para a configuração do Apache e MySQL.

Hoje percebi que o MySQL não estava iniciando, e retornava o erro "XAMPPErrorDomain error 1", que pelo que pesquisei é um erro de permissão apenas.

 

XAMPPErrorDomain error 1

Não sei se esta mensagem de erro dá para outros casos, mas no meu caso ela representava um problema de permissão de execução nos arquivos do MySQL.

A solução foi dar um chmod -R 777 na pasta do MySQL do XAMPP:

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/var/mysql

Pronto, agora é só iniciar o MySQL através do XAMPP Controle e ele deve funcionar corretamente.

 

phpMyAdmin

Vi que o MySQL estava com o processo rodando corretamente mas quando tentei acessar o phpMyAdmin recebi o seguinte erro: 

#1 - Can't create/write to file '/Applications/XAMPP/xamppfiles/temp/#sql274_1_2.MYI' (Errcode: 13)

Novamente problema de permissão de escrita na pasta indicada, outro chmod:

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/temp

Problema resolvido, MySQL rodando e phpMyAdmin funcionando corretamente. Resolveu este problema de outra forma? Compartilha nos comentários para eu manter o post atualizado. 🙂

Automação de código com CakePHP

Após conhecer os conceitos básicos do CakePHP vamos criar a estrutura base para um sistema para cadastro de produtos e categorias de um e-commerce a partir de um modelo de dados do MySQL. 

Para isso precisaremos de um ambiente com: 

XAMPP ou (PHP + MySQL + PHP)

MySQL Workbench

CakePHP

Banco de Dados

Com o MySQL Workbench, crie uma database chamada ecommerce com 2 tabelas (Products,Categories) e insira informações conforme imagem.

Relacionamento: Products hasOne Category || Categories hasMany Products

 

CakePHP

Primeiramente baixar a versão stable do CakePHP e extrair na raiz do htdocs do seu apache com o nome de ecommerce. 

Para quem usa Windows e instalou o XAMPP, deverá extrair o CakePHP em C:\XAMPP\htdocs\ecommerce.

Dentro do diretório ecommerce abra o arquivo: App/Config/database.php.default e altere as informações para conexão com o banco de dados e aponte para a database ecommerce previamente criada. Feito isso, salve-o como App/Config/database.php.

A config ficará assim: 

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'user',
    'password' => 'password',
    'database' => 'ecommerce',
    'prefix' => '',
    //'encoding' => 'utf8',
);
 * For MySQL to connect via socket specify the `unix_socket` parameter instead of `host` and `port`
 

Automação CakePHP

Após informar os dados para conexão com o banco, acesse http://localhost/ecommerce e verifique se há algum problema referente à conexão com banco. Havendo, verifique as informações digitadas no arquivo App/Config/database.php e se o serviço de MySQL está rodando. 

Para usuários de windows:

Antes de continuarmos, precisamos adicionar o PHP ao path do sistema operacional. Para isso, siga o procedimento abaixo: 

– Botão direito em 'Meu Computador'

– Clique em Propriedades

– Na aba avançado, clique em variáveis de ambiente

– Na seção "Variáveis de ambiente" encontre a linha Path e clique em editar

– Adicione ao final da linha o caminho para o arquivo php.exe. Se instalou o XAMPP, apenas adicione ao final da linha o trecho: ;C:\XAMPP\php (Com o ponto e vírgula antes!)

– Salve

 

CakePHP, gere uma aplicação a partir da minha database!

– Abra o terminal ou prompt de comando. (Windows + R e digite cmd)

– Navegue até o diretório do ecommerce. (cd C:\XAMPP\htdocs\ecommerce)

– Entre dentro de lib/Cake/Console. (cd lib/Cake/Console)

– Execute: php cake.php bake all

– Neste ponto ele mostrará as tabelas criadas no banco de dados

– Digite o número correspondente a tabela que deseja gerar a aplicação

– Confirme as perguntas posteriores

– Repita o mesmo processo para todas as tabelas. 

 

All done!

http://localhost/ecommerce/categories

Ao acessar, conseguiremos adicionar categorias e produtos! 

 

Dica

Para conhecer mais a fundo como o CakePHP trabalha, visualize os arquivos gerados em app/Model, app/Controller e app/View. O código gerado é limpo e sem gambiarras, extraindo o que o CakePHP tem de melhor. 

Sua estrutura base para começar a trabalhar no desenvolvimento do ecommerce está criada, o resto compete a você.

Utilize a documentação do CakePHP para utilizar ao máximo das funcionalidades do framework. 

 

Links de Referência

Métodos e Exemplos – http://book.cakephp.org/1.3/pt/view/907/Desenvolvendo-com-CakePHP

Validação de campos – http://book.cakephp.org/1.3/pt/view/1143/Valida%C3%A7%C3%A3o-de-dados

+ sobre a Bakery (geração de código) – http://book.cakephp.org/1.3/pt/view/1522/Geração-de-código-com-o-Bake

 

public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'database_name',
'prefix' => '',
//'encoding' => 'utf8',
);