This is a documentation for Board Game Arena: play board games online !
PHP 8 upgrade: Difference between revisions
Line 5: | Line 5: | ||
== Current Status == | == Current Status == | ||
BGA studio and production are both currently running in a <b>mixed environment</b>, with some servers on PHP 7 and others on PHP 8. Until this upgrade is fully completed, your game code must be compatible with both versions of PHP. You <b>cannot</b> use any PHP 8-specific features yet. | BGA studio and production are both currently running in a <b>mixed environment</b>, with some servers on PHP 7 and others on PHP 8. | ||
Until this upgrade is fully completed, your game code must be compatible with both versions of PHP. You <b>cannot</b> use any PHP 8-specific features yet. | |||
The following servers are currently running PHP 8.2: | The following servers are currently running PHP 8.2: | ||
* <b>PHP 8 gameservers in Studio:</b> 2 | * <b>PHP 8 gameservers in Studio:</b> 2 | ||
* <b>PHP 8 gameservers in Production:</b> 5, 7, 8, 12 | * <b>PHP 8 gameservers in Production:</b> 5, 7, 8, 12 Real-time games may be created on either PHP 7 or PHP 8 servers (if the game indicates PHP 8 support). Turn-based games are always created on PHP 7 servers. | ||
== Control your game's PHP version == | == Control your game's PHP version == | ||
Line 15: | Line 17: | ||
In studio, you can switch between PHP 7.4 and PHP 8.2 using the [https://studio.boardgamearena.com/studio Managed Game] page. You can also change the gameserver portion of the URL between "/1" and "/2" (although this doesn't test your game setup code). For example, https://studio.boardgamearena.com/1/nowboarding?table=575275 is PHP 7 and https://studio.boardgamearena.com/2/nowboarding?table=575275 is PHP 8. | In studio, you can switch between PHP 7.4 and PHP 8.2 using the [https://studio.boardgamearena.com/studio Managed Game] page. You can also change the gameserver portion of the URL between "/1" and "/2" (although this doesn't test your game setup code). For example, https://studio.boardgamearena.com/1/nowboarding?table=575275 is PHP 7 and https://studio.boardgamearena.com/2/nowboarding?table=575275 is PHP 8. | ||
In production, you can add the <b>PHP8</b> tag using the [https://boardgamearena.com/controlpanelgames Game Metadata Manager] page. This allows (but does not guarantee) new real-time tables for your game to be created on one of the PHP 8 | In production, you can add the <b>PHP8</b> tag using the [https://boardgamearena.com/controlpanelgames Game Metadata Manager] page to indicate support for PHP 8. This allows (but does not guarantee) new real-time tables for your game to be created on one of the PHP 8 servers. | ||
== Fix your game's code == | == Fix your game's code == |
Revision as of 19:49, 14 April 2024
Starting December 2023, BGA is upgrading game servers from PHP 7.4 to PHP 8.2. See https://boardgamearena.com/forum/viewtopic.php?t=33940 for more information.
Current Status
BGA studio and production are both currently running in a mixed environment, with some servers on PHP 7 and others on PHP 8.
Until this upgrade is fully completed, your game code must be compatible with both versions of PHP. You cannot use any PHP 8-specific features yet.
The following servers are currently running PHP 8.2:
- PHP 8 gameservers in Studio: 2
- PHP 8 gameservers in Production: 5, 7, 8, 12 Real-time games may be created on either PHP 7 or PHP 8 servers (if the game indicates PHP 8 support). Turn-based games are always created on PHP 7 servers.
Control your game's PHP version
In studio, you can switch between PHP 7.4 and PHP 8.2 using the Managed Game page. You can also change the gameserver portion of the URL between "/1" and "/2" (although this doesn't test your game setup code). For example, https://studio.boardgamearena.com/1/nowboarding?table=575275 is PHP 7 and https://studio.boardgamearena.com/2/nowboarding?table=575275 is PHP 8.
In production, you can add the PHP8 tag using the Game Metadata Manager page to indicate support for PHP 8. This allows (but does not guarantee) new real-time tables for your game to be created on one of the PHP 8 servers.
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_GameClass
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_GameClass { 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_GameClass { 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_GameClass { 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_GameClass { public static function getMaxScore() { return hardback::$instance->getUniqueValueFromDB("SELECT MAX(player_score) FROM player WHERE player_eliminated = 0 AND player_zombie = 0"); }