Search code examples
phpdatabasepdo

Constructor declaring database connection not run after PHP 8 upgrade


I am getting an error when I connecting to database. It was working before the hosting website decide to remove php 7 and add php 8.3

This is the codes of the connection function:

class App {

    function App() {
        include('dbInfo.php');
        try {
            $this->dbConn = new PDO("mysql:host=$host;dbname=$dbName",$dbUser,$dbPass, array(
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_PERSISTENT => true
              ));
        } catch (\Throwable $e) {
            die("ERROR: ".$e->getMessage());
        }
    }

    function getConfig() {
        $sql = $this->dbConn->prepare('SELECT * FROM `config`');
        $sql->execute();
        $result = $sql->fetchAll();
        return $result;
    }

}

And this is the error msg:

Warning: Undefined property: App::$dbConn in /customers/b/b/1/944.dk/httpd.www/server/dataBase/myServer.php on line 29
Fatal error: Uncaught Error: Call to a member function prepare() on null in /customers/b/b/1/944.dk/httpd.www/server/dataBase/myServer.php:29 Stack trace:
#0 /customers/b/b/1/944.dk/httpd.www/server/dataBase/myServer.php(16): App->getConfig()
#1 /customers/b/b/1/944.dk/httpd.www/server/templates/get.php(5): App->getAll()
#2 /customers/b/b/1/944.dk/httpd.www/server/index.php(3): include_once('/customers/b/b/...')
#3 {main} thrown in /customers/b/b/1/944.dk/httpd.www/server/dataBase/myServer.php on line 29

The line 29 is this:

$sql = $this->dbConn->prepare('SELECT * FROM `config`');

Solution

  • From PHP 8.0 on, method with the same name as the class is no longer treated as constructor:

    class Bar {
        public function Bar() {
            // treated as regular method in PHP 8.0
        }
    }
    

    That's why your function App() was never run to create the $this->dbConn.

    You need to rename it as function __construct() to make it a constructor.


    Edit: Previously refer the change to PHP 5.3.3. The change on PHP 5.3.3 only affected namespace classes. The change on PHP 8.0 affects event the class without namespace.