Duvida com funções PHP [RESOLVIDO]

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.

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.