๐ฆธ๐ฟโโ๏ธ Gato GraphQL sekarang ditranspilasi dari PHP 8.0 ke 7.1
Beberapa waktu lalu, saya menulis tentang seni transpilasi kode PHP:
- Transpiling PHP code from 8.0 to 7.x via Rector
- Coding in PHP 7.4 and deploying to 7.1 via Rector and GitHub Actions
Transpilasi kode PHP memungkinkan penggunaan fitur PHP terbaru untuk pengembangan, namun merilis plugin dengan kodenya yang telah dikonversi ke versi PHP yang lebih lama untuk produksi, guna menjangkau basis pengguna yang lebih besar.
Saya telah menghabiskan beberapa minggu terakhir untuk lebih menyempurnakan proses ini untuk plugin Gato GraphQL.
Saya dengan senang hati mengumumkan bahwa, mulai sekarang, versi PHP minimumnya telah ditingkatkan, ke PHP 8.0:

Karena plugin kini dapat mengandalkan PHP 8.0, saya telah berhasil menyelesaikan penambahan tipe ke semua properti untuk semua kelas PHP di seluruh basis kode, kini juga mencakup union types.
Luar biasa!
Berikut adalah ringkasan semua fitur PHP 8.0 baru yang tersedia saat mengembangkan plugin.
Fitur-fitur baru PHP 8.0
Saat mengembangkan Gato GraphQL, fitur-fitur PHP 8.0 berikut kini tersedia:
- Union types
- Pseudo type
mixed - Tipe kembalian
static - Konstanta ajaib
::classpada objek - Ekspresi
match catchpengecualian hanya berdasarkan tipe- Operator Null-safe
- Promosi properti konstruktor kelas
- Koma trailing dalam daftar parameter dan daftar
useclosure
Mari kita lihat contoh masing-masing, bagaimana digunakan dalam plugin untuk pengembangan, dan ke apa mereka ditranspilasi saat menghasilkan graphql-api.zip.
Union types
interface CustomPostTypeAPIInterface
{
public function createCustomPost(array $data): string | int | null | Error;
}Ditranspilasi ke:
interface CustomPostTypeAPIInterface
{
public function createCustomPost(array $data)
}Pseudo type mixed
interface CMSServiceInterface
{
public function getOption(string $option, mixed $default = false): mixed;
}Ditranspilasi ke:
interface CMSServiceInterface
{
public function getOption(string $option, $default = false);
}Konstanta ajaib ::class pada objek
foreach ($directiveResolvers as $directiveResolver) {
$directiveResolverName = $directiveResolver->getDirectiveName();
$this->directiveNameClasses[$directiveResolverName][] = $directiveResolver::class;
}Ditranspilasi ke:
foreach ($directiveResolvers as $directiveResolver) {
$directiveResolverName = $directiveResolver->getDirectiveName();
$this->directiveNameClasses[$directiveResolverName][] = get_class($directiveResolver);
}Ekspresi match
public function getSchemaFieldType(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
$ret = match($fieldName) {
'accessControlLists' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
'cacheControlLists' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
'fieldDeprecationLists' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
'schemaConfigurations' => TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID),
default => parent::getSchemaFieldType($typeResolver, $fieldName),
};
return $ret;
}Ditranspilasi ke:
public function getSchemaFieldType(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
switch ($fieldName) {
case 'accessControlLists':
$ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
break;
case 'cacheControlLists':
$ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
break;
case 'fieldDeprecationLists':
$ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
break;
case 'schemaConfigurations':
$ret = TypeCastingHelpers::makeArray(SchemaDefinition::TYPE_ID);
break;
default:
$ret = parent::getSchemaFieldType($typeResolver, $fieldName);
break;
}
return $ret;
}catch pengecualian hanya berdasarkan tipe
try {
// ...
} catch (InvalidArgumentException) {
return sprintf(
'<p>%s</p>',
\__('Oops, the documentation for this module is not available', 'graphql-api')
);
}Ditranspilasi ke:
try {
// ...
} catch (InvalidArgumentException $exception) {
return sprintf(
'<p>%s</p>',
\__('Oops, the documentation for this module is not available', 'graphql-api')
);
}Operator Null-safe
public function getSchemaDirectiveDeprecationDescription(TypeResolverInterface $typeResolver): ?string
{
return $this->getSchemaDefinitionResolver($typeResolver)?->getSchemaDirectiveDeprecationDescription($typeResolver);
}Ditranspilasi ke:
public function getSchemaDirectiveDeprecationDescription(TypeResolverInterface $typeResolver): ?string
{
return $this->getSchemaDefinitionResolver($typeResolver) ? $this->getSchemaDefinitionResolver($typeResolver)->getSchemaDirectiveDeprecationDescription($typeResolver) : null;
}Promosi properti konstruktor kelas
abstract class AbstractEndpointResolver
{
function __construct(protected EndpointHelpers $endpointHelpers)
{
}
}Ditranspilasi ke:
abstract class AbstractEndpointResolver
{
/**
* @var \GraphQLAPI\GraphQLAPI\Services\Helpers\EndpointHelpers
*/
protected $endpointHelpers;
function __construct(EndpointHelpers $endpointHelpers)
{
$this->endpointHelpers = $endpointHelpers;
}
}Koma trailing dalam daftar parameter dan daftar use closure
public function resolveFieldTypeResolverClass(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
switch ($fieldName) {
case 'accessControlLists':
return CustomPostTypeResolver::class;
}
return parent::resolveFieldTypeResolverClass(
$typeResolver,
$fieldName,
);
}Ditranspilasi ke:
public function resolveFieldTypeResolverClass(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
switch ($fieldName) {
case 'accessControlLists':
return CustomPostTypeResolver::class;
}
return parent::resolveFieldTypeResolverClass($typeResolver, $fieldName);
}