Blog

๐Ÿฆธ๐Ÿฟโ€โ™‚๏ธ Gato GraphQL sekarang ditranspilasi dari PHP 8.0 ke 7.1

Leonardo Losoviz
Oleh Leonardo Losoviz ยท

Beberapa waktu lalu, saya menulis tentang seni transpilasi kode PHP:

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:

Meningkatkan ke versi minimum 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:

Mari kita lihat contoh masing-masing, bagaimana digunakan dalam plugin untuk pengembangan, dan ke apa mereka ditranspilasi saat menghasilkan graphql-api.zip.

Union types

Contoh kode:

interface CustomPostTypeAPIInterface
{
  public function createCustomPost(array $data): string | int | null | Error;
}

Ditranspilasi ke:

interface CustomPostTypeAPIInterface
{
  public function createCustomPost(array $data)
}

Pseudo type mixed

Contoh kode:

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

Contoh kode:

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

Contoh kode:

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

Contoh kode:

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

Contoh kode:

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

Contoh kode:

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

Contoh kode:

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);
}

Berlangganan newsletter kami

Tetap update dengan semua pembaruan Gato GraphQL.