Duvida com funções PHP [RESOLVIDO]

1 resposta
T

Estou iniciando no PHP, estou com esse problmea, agradeço quem poder me ajudar:
Seguinte, tenho esses 2 metodos :

public function criarDiretorio($alunos){
    
      $a= new Logicas();
        //verifica se ja existe o diretorio, caso contrario cria;
              if(is_dir(dirname(dirname(__FILE__))."\Contratos")){
                     $path =dirname(dirname(__FILE__))."\Contratos";//passo o caminho para path
                      chdir($path); //entro no diretorio
        
                     if (is_dir(getcwd()."\\".$alunos->getCurso())){//verifico se ja existe a pasta do curso escolhido
                         $pathdDosCursos = getcwd()."\\".$alunos->getCurso();
                       //AQUI VAMOS CRIAR SALVAR O CONTRATO DO ALUNO
                   //    echo $pathdDosCursos. " ja criadooooooo";
                       
                       
                        $this->$a->CriaTurno($alunos,$pathdDosCursos);
                      }else{//crio o diretorio do curso
                       
                        mkdir(getcwd()."\\".$alunos->getCurso());
                        $pathdDosCursos = getcwd()."\\".$alunos->getCurso();
                       echo $alunos->getTurno();
                        $this-> $a->CriaTurno( $alunos,$pathdDosCursos);
                    }
           
             }else{//crio o diretorio principal
                 mkdir(dirname(dirname(__FILE__))."\Contratos");
                  echo " nao existe";
                 
                }
       
    }

     function CriaTurno( $alunos,$pathdDosCursos){
      $p= new Logicas();
      chdir($pathdDosCursos); //entro no diretorio
      if (is_dir(getcwd()."\\".$alunos->getTurno())){
              //verifico se ja existe o periodo 
              $pathdPeriodo = getcwd(). "\\".$alunos->getTurno();
           //   $this-> $p-> CriaPastaAluno($alunos->getNome(),$pathdPeriodo);
     }else{
      mkdir(getcwd()."\\".$alunos->getTurno());

     }

    }

o problema acontece ao tentar chamar CriaTurno, pois ao retirar a chamada o código funciona, esse é o erro que acontece :

Fatal error: Uncaught Error: Object of class undefined\Logicas could not be converted to string in C:\xampp\htdocs\cerrado\Logicas\Logicas.php:22 Stack trace: #0 C:\xampp\htdocs\cerrado\Acoes\Controladora.php(25): undefined\Logicas->criarDiretorio(Object(Alunos)) #1 {main} thrown in C:\xampp\htdocs\cerrado\Logicas\Logicas.php on line 22

o que estou fazendo de errado , estou iniciando com o PHP, desde já agradeço por qualquer ajuda.

1 Resposta

T

Isso é um código que você pegou para alterar? Pois parece um bocado complexo para alguém iniciante. Eu recomendaria coisas bem mais simples para alguém que não é familiar com a linguagem.

De todo modo, aparentemente o atributo a da sua instância está nulo quando você tenta chamar o método CriaTurno(), pois você tenta chamá-lo usando $this, que se refere à instância da classe que contém o método criarDiretorio.

Infelizmente, o modo como se chama atributos e métodos de uma classe em php tem uma sintaxe bem particular, em que você só precisa do $ no início da declaração, não nos elementos subsequentes. Exemplo:

class ClasseExtra {
  public function chamadaQualquer() {
    echo 'BLA';
  }
}

class Teste {
  public $extra;
  public function __construct() {
    $this->extra = new ClasseExtra(); // note que não tem $ em extra
  }
}

// rodando o código

$umTeste = new Teste();

$umTeste->extra->chamadaQualquer(); // novamente, sem $ em extra

No seu caso, você está declarando as variáveis $a e $p localmente (dentro dos métodos), mas tentando chamá-los subsequentemente com $this, que se refere aos atributos da classe. Se quer usar as variáveis locais, remova os $this.

Mas, se esse código já é sua classe Logicas, e você está tentando chamar o método CriaTurno() que pertence à ela, não precisaria de uma nova instância, basta usar $this->nomeDoMetodo. Algo assim:

public function criarDiretorio($alunos){
    
	// a declaração de $a foi removida aqui

	//verifica se ja existe o diretorio, caso contrario cria;
	if(is_dir(dirname(dirname(__FILE__))."\Contratos")){
		$path =dirname(dirname(__FILE__))."\Contratos";//passo o caminho para path
		chdir($path); //entro no diretorio

	if (is_dir(getcwd()."\\".$alunos->getCurso())){//verifico se ja existe a pasta do curso escolhido
		$pathdDosCursos = getcwd()."\\".$alunos->getCurso();
		//AQUI VAMOS CRIAR SALVAR O CONTRATO DO ALUNO
		//    echo $pathdDosCursos. " ja criadooooooo";


		$this->CriaTurno($alunos,$pathdDosCursos); // não precisa de $a aqui
	}else{//crio o diretorio do curso

		mkdir(getcwd()."\\".$alunos->getCurso());
		$pathdDosCursos = getcwd()."\\".$alunos->getCurso();
		echo $alunos->getTurno();
		$this->CriaTurno( $alunos, $pathdDosCursos);// não precisa de $a aqui
	}

	}else{//crio o diretorio principal
		mkdir(dirname(dirname(__FILE__))."\Contratos");
		echo " nao existe";
	}
}

function CriaTurno( $alunos, $pathdDosCursos){
	// a declaração de $p foi removida aqui
	
	chdir($pathdDosCursos); //entro no diretorio
	if (is_dir(getcwd()."\\".$alunos->getTurno())){
		//verifico se ja existe o periodo 
		$pathdPeriodo = getcwd(). "\\".$alunos->getTurno();
		//   $this->CriaPastaAluno($alunos->getNome(),$pathdPeriodo); // suponho que CriaPastaAluno é um método já presente em Logicas
	}else{
		mkdir(getcwd()."\\".$alunos->getTurno());
	}
}

Importante: prefira declarar nomes de variável e métodos mais longos e coerentes com o contexto, evitando usar somente letras únicas (como $a e $p no seu exemplo). Você escreve mais, mas isso facilita a leitura e compreensão do código. Deixe nomes com um caractere só para casos óbvios (como índices de loop for).

Abraço.

Criado 26 de junho de 2023
Ultima resposta 26 de jun. de 2023
Respostas 1
Participantes 2