Ir para conteúdo

POWERED BY:

Arquivado

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

Paulo Freitas Nobrega

[Resolvido] Orientado ao Objeto

Recommended Posts

Bom Dia Pessoal, gostaria de uma orientação!

 

Estou desenvolvendo algumas classes da seguinte forma:

class minhaclasse {
 function minhafuncao() {
  $valorfinal = 1;
  return $valorfinal;
 }
}

Integro as classes da seguinte forma:

class minhaclasse2 {
 function minhafuncao2() {
  $valorfinal1 = minhaclasse::minhafuncao();
  $valorfinal2 = ($valorfinal1 + $valorfinal2);
  return $valorfinal2;
 }
}
Ou seja, utilizando nomedaclasse::nomedafuncao() para receber valores variados.

 

Estudando PHP Orientado a Objeto percebi a utilização do extends e as visibilidades public, protected e private. A pergunta é: a maneira que citei nos exemplos acima é errada? Se encaixa em Orientação a Objeto?

 

Outra pergunta é: tenho a classe B que faz extends na classe A, posso fazer um extends da classe B na classe C?

 

Obrigado desde já

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estudando PHP Orientado a Objeto percebi a utilização do extends e as visibilidades public, protected e private. A pergunta é: a maneira que citei nos exemplos acima é errada? Se encaixa em Orientação a Objeto?

 

Depende do objetivo do código.

 

Especificamente da forma que você fez é errada sim.

 

Outra pergunta é: tenho a classe B que faz extends na classe A, posso fazer um extends da classe B na classe C?

 

Sim, pode.

 

Veja http://forum.imasters.com.br/public/style_emoticons/default/seta.gif PHP Orientado a Objetos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende do objetivo do código.

 

Especificamente da forma que você fez é errada sim.

Desculpe, mas apenas para iluminar mais a idéia, porque estaria errada? e qual seria o objetivo correto do código para utilização dos exemplos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

apenas para iluminar mais a idéia, porque estaria errada?

 

No caso específico do seu exemplo, você está trabalhando de forma procedural e não orientado a objetos.

 

Sem contar que existe também o problema de acoplamento, ao referenciar diretamente a uma classe específica, você fica dependente da implementação. Isso é problemático quando você precisa mantê-lo.

 

Veja o link que passei, é interessante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá galera, paciência com o cara...

No caso específico do seu exemplo, você está trabalhando de forma procedural e não orientado a objetos.

 

Sem contar que existe também o problema de acoplamento...

Ele deve ler isso e se perguntar: 'Que raios que esse cara tá falando?'

 

Qual de vocês sabia o que era 'acoplamento' quando estavam iniciando no mundo OO? Fica a pergunta...

 

No caso, como por padrão os métodos [funções] em PHP são public [leia sobre visibilidade de propriedades e métodos], a princípio não há nada SINTATICAMENTE errado aqui:

class minhaclasse2 {
 function minhafuncao2() {
 $valorfinal1 = minhaclasse::minhafuncao();
 $valorfinal2 = ($valorfinal1 + $valorfinal2);
 return $valorfinal2;
 }
}
Porém, como foi falado, qual a diferença entre o seu código e este aqui:

function minhafuncao() {
 $valorfinal = 1;
 return $valorfinal;
 }
function minhafuncao2() {
 $valorfinal1 = minhafuncao();
 $valorfinal2 = ($valorfinal1 + $valorfinal2);
 return $valorfinal2;
 }

A funcionalidade é a mesma.

 

Primeiro você precisa entender o espírito da programação orientada a objetos. E isso leva um tempo.

Pesquise um pouco mais sobre o assunto, mas tome cuidado para não pegar exemplos não-explicativos, ou aqueles que cometem o mesmo tipo de erro que cometeu.

 

À medida que forem surgindo as dúvidas, poste aqui que a galera vai ter prazer em ajudar.

 

Bom, é isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Estudando PHP Orientado a Objeto percebi a utilização do extends e as visibilidades public, protected e private. A pergunta é: a maneira que citei nos exemplos acima é errada? Se encaixa em Orientação a Objeto?

 

Depende do objetivo do código.

 

Especificamente da forma que você fez é errada sim.

 

Outra pergunta é: tenho a classe B que faz extends na classe A, posso fazer um extends da classe B na classe C?

 

Sim, pode.

 

Veja http://forum.imasters.com.br/public/style_emoticons/default/seta.gif PHP Orientado a Objetos

 

Obrigado pela indicação do post. Muito interessante mesmo... Mas tenho algumas dúvidas e com certeza são de iniciante.

 

1) A classe Page:

class Page extends AbstractComponent {
	private $title;
	
	public function __construct( $title ){
		$this->title = $title;
	}
	
	public function draw(){
		echo '<html>';
		echo '<head>';
		echo '<title>' , $this->title , '</title>';
		echo '</head>';
		echo '<body>';
		$this->drawChilds();
		echo '</body>';
		echo '</html>';
	}
}

É chamda da seguinte forma:

$pagina = new Page( 'PHP Orientado a Objetos' );

Em nenhum momento a função __construct() é chamada, como ele define o valor de $title?

 

 

2) Nesta função:

public function hasChilds(){		
	return count( $this->childs ) > 0;		
}

A forma de se ler isso seria "se o resultado de count for maior que 0 return em $this->childs" ???

 

 

3) Outra função:

public function addChild( Component $child ){
	throw new Exception( 'Esse componente não pode ter filhos.' );
}

Não entendi esse linha throw new Exception('Esse componente ....'), o que ela faz???

 

 

Valew!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em nenhum momento a função __construct() é chamada, como ele define o valor de $title?

http://www.php.net/manual/pt_BR/language.oop5.decon.php

 

A forma de se ler isso seria "se o resultado de count for maior que 0 return em $this->childs" ???

Nops. Imagine isso que você leu dentro de um IF.

 

if ( count( $this->childs ) > 0 ) { ... } else { ... }

 

Pois é, o PHP vai avaliar a expressão lógica "count( $this->childs ) > 0" e então obter um valor BOOLEANO. Se for true, executa o primeiro bloco de código, se for false, executa o bloco do else.

 

return count( $this->childs ) > 0;

 

Ou seja, da mesma maneira que o "count( $this->childs ) > 0" foi avaliado pelo PHP dentro do IF, ele também será avaliado aqui. Se for true, o método irá retornar true, se for false, irá retornar false.

 

Não entendi esse linha throw new Exception('Esse componente ....'), o que ela faz???

http://www.php.net/manual/pt_BR/language.exceptions.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peço desculpa por postar neste post (RESOLVIDO), mas é que me surgiu uma nova dúvida!

 

Criei a seguinte classe teste:

 

class gemakMysql {
	private $host;
	private $database;
	private $username;
	private $password;
	private $conn;
	
	function __construct( $host, $db, $user, $password ) {
		$this->database( $host, $db, $user, $password );
	}
	
	public function database ( $host, $db, $user, $password ) {
		$this->host = $host;
		$this->database = $db;
		$this->username = $user;
		$this->password = $password;
		$this->conn = mysql_connect( $this->host, $this->username, $this->password ) or die ( 'Não foi possível conectar ao db' );
		mysql_select_db( $this->database );
	}
	
	public function query($sql) {
		$sql = mysql_query($sql) or die (mysql_error());
		return $sql;
	}
	
	public function dealRows($sql) {
		return mysql_num_rows($sql);
	}
	
	public function loadResult($sql) {
		if($this->dealRows($sql)>0){
			return mysql_fetch_array($sql);
		}
	}
	
	public function insertId() {
		return mysql_insert_id( $this->conn );
	}
	
	public function close() {
		mysql_close( $this->conn );
	}
	
}

Extendendo a função posso usar a mesma perfeitamente:

class teste extends gemakMysql {

}

 

$gemakMysql = new teste( 'localhost','test','root','' );

$sql = $gemakMysql->query("INSERT INTO teste (name) VALUES ('teste')");

print $gemakMysql->insertId(); //retorno-> 1,2,3,4.....

$gemakMysql->close();

 

Supondo que eu tenha uma classe chamada menus que extende de tools:

class menus extends tools {
}

qual a meneira correta de chamar uma conexão usando a classe gemakMysql dentro da classe menus extendida de tools?

 

Pensei algo do tipo (abaixo) mas não sei se é correto:

class menus extends tools {
public $gemakMysql;
function __construct( $gemakMysql ) {
$this->gemakMysql = $gemakMysql;
}
}

$gemakMysql = new gemakMysql( 'localhost','test','root','' );
$gemakMenus = new gemakMenu( $gemakMysql );

Valew!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A princípio estou dando uma olhada no Singleton:

<php
class DB {
  private static $instance = false;

  private function __construct() {}

  public static function getInstance() {
    if (false === DB::$instance) {
      DB::$instance = new DB;
    }
    return DB::$instance;
  }
}

$db = DB::getInstance();

Agora, se eu desejar passar alguns parametros para __construct() (por exemplo, $host,$db,$user,$password) como devo fazer?

 

Porque fiz dessa forma:

public static function getInstance( $host, $db, $user, $password ) {		
		if (false === gemakMysql::$instance) {
			gemakMysql::$instance = new gemakMysql( $host, $db, $user, $password );
		}
		return gemakMysql::$instance;
	}

private function __construct( $host, $db, $user, $password ) {
		$this->host = $host;
		$this->database = $db;
		$this->username = $user;
		$this->password = $password;
		$this->conn = mysql_connect( $this->host, $this->username, $this->password ) or die ( $this->error(mysql_error() ) );
		mysql_select_db( $this->database ) or die ( $this->error( mysql_error() ) );	
	}	

$gemakMysql = gemakMysql::getInstance( 'localhost','gemak','root','' );

Isso esta certo?

 

E para usar dentro de outra função:

class teste {
public function test() {
$gemakMysql = gemakMysql::getInstance( 'localhost','gemak','root','' );
$gemakMysql->query('bla bla bla');
}
}
Essa seria a forma correta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hehehe... lá vem eu novamente!

 

Só para finalizar, gostaria de saber qual desses três códigos seria o melhor:

 

1) O primeiro é o que esta postado acima com Singleton.

 

2) O segundo utilizando Registry e setando os valores de conexão através de função:

 

<?php
class Registry {
	private static $_register;
	
	public static function add(&$item, $name = null)
	{
		if (is_object($item) && is_null($name)) {
			$name = get_class($item);
		} elseif (is_null($name)) {
			$msg = "Você deve setar um nome para não-objetos";
			throw new Exception($msg);
		}
		$name = strtolower($name);
		self::$_register[$name] = $item;
	}
	
	public static function &get($name)
		{
			$name = strtolower($name);
		if (array_key_exists($name, self::$_register)) {
				return self::$_register[$name];
		} else {
		  $msg = "$name não esta registrado.";
		  throw new Exception($msg);
		}
	}
	
	public static function exists($name)
	{
		$name = strtolower($name);
		if (array_key_exists($name, self::$_register)) {
		  return true;
		} else {
		  return false;
		}
	}
}

class gemakMysql {
	public $host;
	public $database;
	public $username;
	public $password;
	private $conn;
	private $logs = true;
	
	public function conn() {
		$this->conn = mysql_connect( $this->host, $this->username, $this->password ) or die ( $this->error(mysql_error() ) );
		mysql_select_db( $this->database ) or die ( $this->error( mysql_error() ) );	
	}
	
	public function error( $error ) {
		$msgError = date("d/m/Y H:i:s - ") . $error . PHP_EOL;
		
		print $msgError;
		!is_dir('error/') ? mkdir( 'error/' ) : false;
		$this->logs ? error_log( $msgError, 3, 'error/error.log') : false;
		
	}
	
	public function setDataDB( $var,$value ) {
		$this->$var = $value;
	}
	
	public function getDataDB ( $var ) {
		print $this->$var;
	}
	
	public function query($sql) {
		$sql = mysql_query($sql) or die ( $this->error(mysql_error() ) );
		return $sql;
	}
	
	public function dealRows($sql) {
		return mysql_num_rows($sql);
	}
	
	public function loadResult($sql) {
		if($this->dealRows($sql)>0){
			return mysql_fetch_object($sql);
		}
	}
	
	public function insertId() {
		return mysql_insert_id( $this->conn );
	}
	
	public function close() {
		mysql_close( $this->conn );
	}
	
}

$db = new gemakMysql;
$db->setDataDB( 'host','localhost' );
$db->setDataDB( 'database','gemak' );
$db->setDataDB( 'username','root' );
$db->setDataDB( 'password','' );
$db->conn();

$registry = new Registry;
$registry->add( $db,'mydb' );
$mydb = $registry->get( 'mydb' );

print $mydb->dealRows( $mydb->query("SELECT * FROM gemak_menus") );
?>

3) O terceiro utilizando Registry e setando os valores de conexão através de __construct():

 

<?php
class Registry {
	private static $_register;
	
	public static function add(&$item, $name = null)
	{
		if (is_object($item) && is_null($name)) {
			$name = get_class($item);
		} elseif (is_null($name)) {
			$msg = "Você deve setar um nome para não-objetos";
			throw new Exception($msg);
		}
		$name = strtolower($name);
		self::$_register[$name] = $item;
	}
	
	public static function &get($name)
		{
			$name = strtolower($name);
		if (array_key_exists($name, self::$_register)) {
				return self::$_register[$name];
		} else {
		  $msg = "$name não esta registrado.";
		  throw new Exception($msg);
		}
	}
	
	public static function exists($name)
	{
		$name = strtolower($name);
		if (array_key_exists($name, self::$_register)) {
		  return true;
		} else {
		  return false;
		}
	}
}

class gemakMysql {
	public $host;
	public $database;
	public $username;
	public $password;
	private $conn;
	private $logs = true;
	
	function __construct( $host, $db, $user, $password ) {
		$this->host = $host;
		$this->database = $db;
		$this->username = $user;
		$this->password = $password;
		$this->conn = mysql_connect( $this->host, $this->username, $this->password ) or die ( $this->error(mysql_error() ) );
		mysql_select_db( $this->database ) or die ( $this->error( mysql_error() ) );	
	}
	
	public function error( $error ) {
		$msgError = date("d/m/Y H:i:s - ") . $error . PHP_EOL;
		
		print $msgError;
		!is_dir('error/') ? mkdir( 'error/' ) : false;
		$this->logs ? error_log( $msgError, 3, 'error/error.log') : false;
		
	}
	
	public function setDataDB( $var,$value ) {
		$this->$var = $value;
	}
	
	public function getDataDB ( $var ) {
		print $this->$var;
	}
	
	public function query($sql) {
		$sql = mysql_query($sql) or die ( $this->error(mysql_error() ) );
		return $sql;
	}
	
	public function dealRows($sql) {
		return mysql_num_rows($sql);
	}
	
	public function loadResult($sql) {
		if($this->dealRows($sql)>0){
			return mysql_fetch_object($sql);
		}
	}
	
	public function insertId() {
		return mysql_insert_id( $this->conn );
	}
	
	public function close() {
		mysql_close( $this->conn );
	}
	
}

$db = new gemakMysql('localhost','gemak','root','');
$registry = new Registry;
$registry->add( $db,'mydb' );
$mydb = $registry->get( 'mydb' );

print $mydb->dealRows( $mydb->query("SELECT * FROM gemak_menus") );
?>

Ambas (2/3) são chamadas em classes da seguinte forma:

 

class teste {
	private $db;
	
	function __construct( $db ) {
		$this->db = $db;
	}
	
	public function test() {
		print $this->db->dealRows( $this->db->query("SELECT * FROM gemak_menus") );
	}
	
}

$teste = new teste( $mydb );
$teste->test();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca vi de outro jeito que não direto pelo construtor.

 

Ainda mais quando você trabalhar com Registry (que o @João Batista Neto chama de "grande caixa"), é muito mais prático você armazenar o objeto pronto, com tudo definido para que, quando precisar dele, resgatar o objeto inteiro e já usar os métodos dele, direto, sem ter de a cada uso ficar definindo usuário, senha, banco...

 

Julgando que você centralizaria essas informações num arquivo de configuração, imagina quantos require(_once) você não faria desnecessáriamente toda santa vez que fosse usar o objeto DB.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca vi de outro jeito que não direto pelo construtor.

(...)

Julgando que você centralizaria essas informações num arquivo de configuração, imagina quantos require(_once) você não faria desnecessáriamente toda santa vez que fosse usar o objeto DB.

 

Falou tudo! Registry, my friend!

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

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.