🦸🏿♂️ Gato GraphQL artık PHP 8.0'dan 7.1'e transpile ediliyor
Bir süre önce PHP kodunu transpile etme sanatı hakkında yazdım:
- 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
PHP kodunu transpile etmek, geliştirme için en son PHP özelliklerini kullanmayı mümkün kılarken, daha geniş bir kullanıcı kitlesini hedeflemek amacıyla eklentiyi üretim ortamında eski bir PHP sürümüne dönüştürülmüş hâliyle yayınlamaya olanak tanır.
Son birkaç haftayı Gato GraphQL eklentisi için bu süreci daha da iyileştirerek geçirdim.
Artık bundan böyle gerekli PHP sürümünün PHP 8.0'a yükseltildiğini duyurmaktan mutluluk duyuyorum:

Eklenti artık PHP 8.0'a güvenebildiğinden, kod tabanındaki tüm PHP sınıflarının tüm özelliklerine union type'lar da dahil olmak üzere bir tür eklemeyi tamamlayabildim.
Harika!
İşte eklentiyi geliştirirken kullanılabilecek tüm yeni PHP 8.0 özelliklerinin özeti.
Yeni PHP 8.0 özellikleri
Gato GraphQL geliştirilirken aşağıdaki PHP 8.0 özellikleri artık kullanılabilir:
- Union types
mixedsözde tipistaticdönüş tipi- Nesnelerde
::classsihirli sabiti matchifadeleri- Yalnızca türe göre
catchistisnaları - Null-safe operatörü
- Sınıf yapıcısında özellik tanıtımı
- Parametre listelerinde ve closure
uselistelerinde sona koyulan virgüller
Her birinin bir örneğini, eklentide geliştirme için nasıl kullanıldıklarını ve graphql-api.zip oluşturulurken neye transpile edildiklerini görelim.
Union types
interface CustomPostTypeAPIInterface
{
public function createCustomPost(array $data): string | int | null | Error;
}Transpile edilmiş hâli:
interface CustomPostTypeAPIInterface
{
public function createCustomPost(array $data)
}mixed sözde tipi
interface CMSServiceInterface
{
public function getOption(string $option, mixed $default = false): mixed;
}Transpile edilmiş hâli:
interface CMSServiceInterface
{
public function getOption(string $option, $default = false);
}Nesnelerde ::class sihirli sabiti
foreach ($directiveResolvers as $directiveResolver) {
$directiveResolverName = $directiveResolver->getDirectiveName();
$this->directiveNameClasses[$directiveResolverName][] = $directiveResolver::class;
}Transpile edilmiş hâli:
foreach ($directiveResolvers as $directiveResolver) {
$directiveResolverName = $directiveResolver->getDirectiveName();
$this->directiveNameClasses[$directiveResolverName][] = get_class($directiveResolver);
}match ifadeleri
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;
}Transpile edilmiş hâli:
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;
}Yalnızca türe göre catch istisnaları
try {
// ...
} catch (InvalidArgumentException) {
return sprintf(
'<p>%s</p>',
\__('Oops, the documentation for this module is not available', 'graphql-api')
);
}Transpile edilmiş hâli:
try {
// ...
} catch (InvalidArgumentException $exception) {
return sprintf(
'<p>%s</p>',
\__('Oops, the documentation for this module is not available', 'graphql-api')
);
}Null-safe operatörü
public function getSchemaDirectiveDeprecationDescription(TypeResolverInterface $typeResolver): ?string
{
return $this->getSchemaDefinitionResolver($typeResolver)?->getSchemaDirectiveDeprecationDescription($typeResolver);
}Transpile edilmiş hâli:
public function getSchemaDirectiveDeprecationDescription(TypeResolverInterface $typeResolver): ?string
{
return $this->getSchemaDefinitionResolver($typeResolver) ? $this->getSchemaDefinitionResolver($typeResolver)->getSchemaDirectiveDeprecationDescription($typeResolver) : null;
}Sınıf yapıcısında özellik tanıtımı
abstract class AbstractEndpointResolver
{
function __construct(protected EndpointHelpers $endpointHelpers)
{
}
}Transpile edilmiş hâli:
abstract class AbstractEndpointResolver
{
/**
* @var \GraphQLAPI\GraphQLAPI\Services\Helpers\EndpointHelpers
*/
protected $endpointHelpers;
function __construct(EndpointHelpers $endpointHelpers)
{
$this->endpointHelpers = $endpointHelpers;
}
}Parametre listelerinde ve closure use listelerinde sona koyulan virgüller
public function resolveFieldTypeResolverClass(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
switch ($fieldName) {
case 'accessControlLists':
return CustomPostTypeResolver::class;
}
return parent::resolveFieldTypeResolverClass(
$typeResolver,
$fieldName,
);
}Transpile edilmiş hâli:
public function resolveFieldTypeResolverClass(TypeResolverInterface $typeResolver, string $fieldName): ?string
{
switch ($fieldName) {
case 'accessControlLists':
return CustomPostTypeResolver::class;
}
return parent::resolveFieldTypeResolverClass($typeResolver, $fieldName);
}