Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sacomé

OO->Funções->estáticas

Recommended Posts

Bem, um programador tem que dominar programação orientada, mas e quando agente vicia em funções estáticas porque é mais rápido para chamar, em alguns casos é claro. Eu gostaria de pedir a opnião dos meus caros amigos, estou usando função estática demais o que vcs acham?

 

Ex:

<?
class classe{

public static function func(){
//operações aqui;
}
}


// Uma função estática para chamar é mais rápido

classe::func();

// e dentro;
self::func();

// Quando não, temos que criar um objeto

$forum=new classe();
$forum->func();

// e dentro;
$this->func();

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não vejo sentido em usar um método estático aí não.

 

Não importa seu código ser mais curto, de rápida digitação, se ele trabalha de forma errada.

 

Qual o objetivo desejado com esse método abril()? Seria o mês ou a Editora em si? Se for mês, pretende criar um método para cada mês? E repetir todo código de uma consulta em cada um deles? Se for A Editora, você vai repetir entre as MLHARES de editoras que existe?

 

DRY :seta: Don't Repeat Yourself

 

class Publisher {

   public class searchByName( $publisher ) {
       return sprintf( 'SELECT * FROM `publishers` WHERE `publisher` = "%s"', trim( $publisher ) );
   }

   public class searchById( $id ) {
       return sprintf( 'SELECT * FROM `publishers` WHERE `pid` = "%s"', intval( $id ) );
   }
}

$db = new PDO( /* ... */ )

$publisher = new Publisher;

$stmt = $db -> query( $publisher -> searchByName( 'Abril' ) );

$publisherData = ( $stmt !== FALSE ? $stmt -> fetch() : FALSE );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não vejo sentido em usar um método estático aí não.

 

Você percebeu que não tem nada a ver o nome abril e editora pois são apenas para exemplos

 

Amigos que lem esta resposta, não entrem nessa de achar que estou perguntando como programar para ser rápido e dinãmico, não estou perguntando isso.

 

O que estou falando é apenas uma vaidade de rapidez para chamar repito chamar com isso:: ou com objeto->

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro você tem que entender o significado de um método ou atributo estático.

Enquanto que métodos normais dizem respeito a um único objeto, um método estático está contido no escopo da classe.

 

O problema de métodos estáticos é que eles são "globais", pois podem ser acionados de qualquer lugar do programa.

Imagine a seguinte classe:

class Example {
private static $var = 'hehe';
public static function setVar($newVal){
	self::$var = $newVal;
}

public static function getVar(){
	return self::$var;
}
}

 

Qual o problema dela?

No seu programa, várias outras classes fazem uso da classe Example. Se algum deles alterar o valor do atributo estático $var, essa alteração repercutirá para todo o código:

class App1 {
public function doSomething(){
	echo Example::getVar().PHP_EOL;
	Example::setVar('=P');
}
}

class App2 {
public function doSomethingElse(){
	echo Example::getVar().PHP_EOL;		
}
}

$app1 = new App1();
$app1->doSomething();

$app2 = new App2();
$app2->doSomethingElse();
//Saída: 
hehe 
=P

 

Se Example não fosse estático, poderíamos fazer assim:

class Example {
private $var = 'hehe';
public function setVar($newVal){
	$this->var = $newVal;
}

public function getVar(){
	return $this->var;
}
}

class App1 {
public function doSomething(){
	$example = new Example();
	echo $example->getVar().PHP_EOL;
	$example->setVar('=P');
}
}

class App2 {
public function doSomethingElse(){
	$example = new Example();
	echo $example->getVar().PHP_EOL;
}
}

$app1 = new App1();
$app1->doSomething();

$app2 = new App2();
$app2->doSomethingElse();
//Saída:
hehe
hehe

 

Devido a essa natureza global de métodos e propriedades estáticas, fica difícil debuggar seu código caso haja erros na execução. Esse exemplo que eu mostrei é simples e "previsível", mas imagine um sistema grande fazendo chamadas estáticas. Um método de uma classe pode chamar um método estático nessa sua classe esperando por um tipo de retorno e receber outro totalmente diferente.

 

Você "escreve mais"? Sim, nem tudo na vida são flores. A sintaxe do PHP não nos permite algo como:

new Example().getVar();

Como o Javascript ou o Ruby permitem.

 

A questão é que vale a pena digitar um pouco mais para dar mais legibilidade e facilidade de debug ao seu código.

Use métodos e variáveis estáticas o mínimo possível.

Um exemplo: contar quantas instâncias de uma determinada classe existem na aplicação

class MyClass {
private static $instances;
public function __construct(){
	self::$instances++;
}

public function __destruct(){
	self::$instances--;
}

public function doSomething(){
	echo 'Hehe';
}

public static function getTotalInstances(){
	return self::$instances;
}
}

$v1 = new MyClass();
echo MyClass::getTotalInstances().PHP_EOL;
//Saída: 1

$v2 = new MyClass();
echo MyClass::getTotalInstances().PHP_EOL;
//Saída: 2

$v3 = new MyClass();
echo MyClass::getTotalInstances().PHP_EOL;
//Saída: 3

unset($v2);
echo MyClass::getTotalInstances().PHP_EOL;
//Saída: 2

 

Espero ter sido claro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Espero ter sido claro...

 

 

Era apenas isso que estava perguntando, questão usar muito ou pouco estatic, e não sobre o exemplo que escrevi.

 

Você foi muito bem, mas:

 

Vale lembrar que não venho tendo problemas com funções estáticas, já fiz sites inteiros só com funções estáticas, de certo modo me adaptei a trabalhar assim e descobri meus próprios caminhos com funções estáticas.

 

O Henrique está certo e lembrar = new lembrem-se(); Toda informação é tijolo para construir nossa própria casa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que estou falando é apenas uma vaidade de rapidez para chamar repito chamar com isso:: ou com objeto->

Eu acho que você deve esquecer esse pensamento.

 

É possível sim, programar sites inteiros usando todos os métodos estáticos, ou não usando nenhum.

Porém, não existe uma "vaidade" ou "preferência" por uma ou outra forma.

 

 

Cada um existe para um motivo. Use o correto para o problema que você tem. Apenas isso.

Não use estático, onde deveria usar objeto, e não use objeto onde deveria usar estático, isso se você quiser programar "corretamente", ou seja, da maneira e da finalidade para qual cada forma foi criada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.