Método não encontrado na sala de aula

Estou trabalhando em uma function de login, mas recebi um erro que não consigo descobrir.

Esta é a minha class de Login Modelo:

class Login { private $username; private $password; private $cxn; //database object function __construct($username,$password) { //set data $this->setData($username, $password); //connect DB $this->connectToDB(); // get Data } function setData($username, $password) { $this->username = $username; $this->password = $password; } private function connectToDB() { include 'Database.php'; $connect = '../include/connect.php'; $this->cxn = new database($connect); } function getData() { $query = "SELECT * FROM anvandare WHERE anvandarnamn = '$this->username' AND losenord ='$this->'password'"; $sql = mysql_query($query); if(mysql_num_rows($sql)>0) { return true; } else { throw new Exception("Användarnamnet eller Lösenordet är fel. Försök igen."); } } function close() { $this->cxn->close(); //Here is the error it says "Method 'close' not found in class } } 

A última function dá erro ” Método ‘fechar’ não encontrado na class “, “O método referente não é encontrado na class de assunto.

Aqui está a minha class Database:

 class Database { private $host; private $user; private $password; private $database; function __construct($filename) { if(is_file($filename)) include $filename; else throw new exception("Error!"); $this->host=$host; $this->user=$user; $this->password=$password; $this->database=$database; $this->connect(); } private function connect() { //Connect to the server if(!mysql_connect($this->host, $this->user, $this->password)) throw new exception("Error, not connected to the server."); //Select the database if(!mysql_select_db($this->database)) throw new exception("Error, no database selected"); } function close() { mysql_close(); } } 

Os caminhos estão corretos, então não é isso. Qual poderia ser o erro?

PhpStorm não consegue descobrir o tipo de seu campo $this->cxn . Você pode ajudar, fornecendo tipohint através de simples comentários PHPDoc:

 /** @var Database */ private $cxn; //database object 

também essa dica está ajudando o PHPstorm a reconhecer os methods corretamente

se você tiver um código como este:

 foreach( $myEntity as $entity ) { $entity->myValidMethod(); } 

apenas adicione essa sugestão:

 /* @var $entity \My\Name\Space\Path\MyEntity */ foreach( $myEntity as $entity ) { $entity->myValidMethod(); } 

Obrigado a http://mossco.co.uk/symfony-2/how-to-fix-method-not-found-in-class-orange-warning-in-phpstorm/

Não acho que haja problemas de visibilidade no código. O manual do PHP indica:

 Class methods may be defined as public, private, or protected. Methods declared without any explicit visibility keyword are defined as public. 

Eu acho que você pode ter duas classs de database. Problema semelhante foi descrito neste tópico: a melhor maneira de chamar a function de uma aula estendida

Em vez da function close () , você pode tentar a function __destruct() {} Reference

O problema é em falta público / protegido / privado

você deve apenas adicionar a palavra-chave “pública” na declaração do método na sua class de database IMHO

 public function close()