PHP 8 upgrade
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");
}
