This is a documentation for Board Game Arena: play board games online !

PHP 8 upgrade

From Board Game Arena
Jump to navigation Jump to search


Official documentation


Useful Components

Official

Unofficial



Game Development Process



Guides for Common Topics



Miscellaneous Resources

Starting in 2023-12, BGA began upgrading game servers from PHP 7.4 to PHP 8.2. See https://boardgamearena.com/forum/viewtopic.php?t=33940 for more information.

As of 2024-08-09, the BGA upgrade to PHP 8.2 is complete. Your game can now use PHP 8-specific features. 🎉

As of 2025-10-06, the BGA upgrade to PHP 8.8 is complete. Your game can now use PHP 8.4-specific features. 🎉

Fix your game's code

Here are a few common scenarios that may make your game incompatible with PHP 8 and how to fix them:

implode argument order

📖 See https://www.php.net/manual/en/function.implode.php

The signature of this function is implode(string $separator, array $array): string. PHP 7 accepted the arguments in either order, but PHP 8 requires the string argument first and the array argument second.

Static calls to non-static methods

📖 See https://php.watch/versions/8.0/non-static-static-call-fatal-error and https://www.php.net/manual/en/language.oop5.basic.php

PHP 8 no longer allows non-static class methods to be called statically. This may affect your game if you've created a class which extends APP_DbObject and you call various BGA framework functions statically using self::.

If possible, the simplest change is to replace self:: with $this-> (which refers to the current instance of your game class). This works if your function is non-static.

Non-compliant example:

   class NMap extends APP_DbObject {
       public function getPossibleMoves($playerId) {
           $planeHasNervous = intval(self::getUniqueValueFromDB("SELECT COUNT(1) FROM `pax` WHERE `player_id` = $playerId AND `status` = 'SEAT' AND `vip` = 'NERVOUS'")) > 0;

Fix:

   class NMap extends APP_DbObject {
       public function getPossibleMoves($playerId) {
           $planeHasNervous = intval($this->getUniqueValueFromDB("SELECT COUNT(1) FROM `pax` WHERE `player_id` = $playerId AND `status` = 'SEAT' AND `vip` = 'NERVOUS'")) > 0;

Otherwise, if your own function is static and $this-> doesn't exist, you can create a static variable like $instance in your game class, populate the variable in your game's constructor, and call the BGA framework functions through this variable.

Non-compliant example:

   class PlayerMgr extends APP_DbObject {
       public static function getMaxScore() {
           return self::getUniqueValueFromDB("SELECT MAX(player_score) FROM player WHERE player_eliminated = 0 AND player_zombie = 0");
       }

Fix:

   class hardback extends Table {
       public static $instance = null;
       function __construct() {
           parent::__construct();
           self::$instance = $this;
   class PlayerMgr extends APP_DbObject {
       public static function getMaxScore() {
           return hardback::$instance->getUniqueValueFromDB("SELECT MAX(player_score) FROM player WHERE player_eliminated = 0 AND player_zombie = 0");
       }