Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
eu gostaria de criar uma classe para incluir partes de html dentro do meu layout
para isso eu queria fazer algo do tipo:
class Includes
{
private $include;
public function inc()
{
include_once "include/".$this->include.".phtml";
}
}
e <?php echo $include->bottom_master;?> no meu html
como sou novo em orientação a objetos, não estou conseguindo fazer essa simples coisa.
poderiam me dizer aonde estou errando, por favor?
obrigado,>
1 hora atrás, Progjunior Daniel disse:
O atributo $includes é private, então você tem que setar ele primeiro. Você está fazendo isso?
Sim!
$includes = new Includes;
Mas eu queria fazer isso dentro da classe, se possível...Claro que é possivel.
public function setInclude($temp)
{
$this->includes = $temp;
}
Ai você seta o valor
$includes->setInclude($valor);Se instanciar a classe Includes
e chamar o método inc(); com um var_dump verá que não retorna nada. Porque?
Porque atributo privado $include não possui valor algum
Você pode fazer assim:
<?php
class Includes {
private $include;
public function inc($parametro) {
$this->include = $parametro;
return ("include/{$this->include}.phtml");
}
}
Para executar ficaria assim. O método vai buscar na pasta include o arquivo "um_arquivo_qualquer.phtml"
$objeto = new Includes();
include($objeto->inc('um_arquivo_qualquer'));
Então há uma forma que acho melhor de executar isso. Pois isso é algo corriqueiro então nada melhor que usar métodos estáticos, e incrementar o método de forma a que ele seja automatizado em encontrar arquivos nem que estejam e diretórios diferentes, veja como fica:
<?php
class Includes {
public static function inc($file) {
$Dir = [
'template',
'etc'
];
$incGet = null;
if (isset($file)) {
foreach ($Dir as $folders) {
if (!$incGet && file_exists(__DIR__ . '/include/' . $folders . '/' . $file . '.phtml')) {
$incGet = true;
return (__DIR__ . '/include/' . $folders . '/' . $file . '.phtml');
}
}
}
if (!$incGet) {
return (__DIR__ . '/404.phtml');
}
}
}
Interessante não? O método entra busca por arquivos nas pastas "**template**" & "**etc**" que estão dentro da pasta "**include**".
Se o arquivo existe retorna ele, caso contrário retorna um outro arquivo para personalizar o erro.
Para executar fica assim, desde-que já tenha dado include no arquivo que contém a classe (Classes estáticas não precisam criar objetos para elas)
include (Includes::inc('teste'));
Nesse caso a classe se responsabiliza por encontrar o arquivo **teste.phtml** dentro de **includes/template** ou em **includes/etc**
Se entendeu você pode colocar quantas pastas quiser como diretório de buscaShow!!!
muito obrigado todos vocês pela ajuda a explicação.
estou com uma outra dúvida, caso possam me ajudar de novo, por favor.
quero recuperar um valor de um atributo passado dentro de uma classe?
Por ex:
class Class
{
public $cor;
public function cor(){
if(basename(getcwd()) == 'index'){
$this->cor = '654321';
}else{
$this->cor = '123456';
}
}
}
Para recuperar estou tentando fazer assim.
$obj = new Class();
echo $obj->cor;
mas o var_dum retorna null@ndias É porque tanto o método como a atributo tem os mesmos nomes.
No caso aí o php está chamando o método, porém o método não retorna nada só preenche o valor de um atributo.
Como o atributo é publico você poderia mudar o nome dele, ou mesmo o nome do método, tanto faz. Basta que acione o método para executar, pós então você pode mostrar o atributo.
class MyClass {
public $cor;
public function metodoCor() {
$this->cor = 'blablabla';
}
}
////////
$obj = new MyClass();
$obj->metodoCor(); // Para preencher o atributo
echo ($obj->cor);
Para o método retornar valor basta que adicione o retorno dentro do método, só que esse não é a ideia quando se usa atributos públicos pois os mesmos podem ser manipulados externamente.
$this->cor = 'blablabla';
return ($this->cor);
Para não alongar muito a conversa, de uma lida nessa postagem que fiz, tem vários exemplos de como trabalhar com isso aí:>
19 minutos atrás, Omar~ disse:
@ndias É porque tanto o método como a atributo tem os mesmos nomes.
No caso aí o php está chamando o método, porém o método não retorna nada só preenche o valor de um atributo.
Como o atributo é publico você poderia mudar o nome dele, ou mesmo o nome do método, tanto faz. Basta que acione o método para executar, pós então você pode mostrar o atributo.
class MyClass {
public $cor;
public function metodoCor() {
$this->cor = 'blablabla';
}
}
////////
$obj = new MyClass();
$obj->metodoCor(); // Para preencher o atributo
echo ($obj->cor);
Para o método retornar valor basta que adicione o retorno dentro do método, só que esse não é a ideia quando se usa atributos públicos pois os mesmos podem ser manipulados externamente.
$this->cor = 'blablabla';
return ($this->cor);
Para não alongar muito a conversa, de uma lida nessa postagem que fiz, tem vários exemplos de como trabalhar com isso aí:
Mesmo trocando o nome do método, e adicionando o retorno dentro do método, não rolou! retorna nulo!>
12 minutos atrás, ndias disse:
Mesmo trocando o nome do método, e adicionando o retorno dentro do método, não rolou! retorna nulo!
agora rolou!
fiz assim:
class MyClass {
public $cor;
public function __construct() {
$this->cor = 'blablabla';
}
public function metodoCor() {
return $this->cor;
}
}
////////
$obj = new MyClass();
$obj->cor;agora uma pergunta de leigo: essa classe eu fiz para utilizar em diversas páginas....páginas essas cujo trechos estão separados por includes...
no procedural, eu conseguia nas includes recuperar as variáveis da página...
na orientação a objetos eu tenho q instanciar a classe em todas includes?
O atributo $includes é private, então você tem que setar ele primeiro. Você está fazendo isso?