WordPress

An Stiùireadh Deireannach airson Transpiling Code PHP

Ann an suidheachaidhean a tha air leth freagarrach, bu chòir dhuinn PHP 8.0 (an dreach as ùire mar seo a sgrìobhadh) a chleachdadh airson na làraichean againn uile agus ùrachadh a dhèanamh cho luath ‘s a thèid dreach ùr fhoillseachadh. Ach, gu tric feumaidh luchd-leasachaidh obrachadh le dreachan PHP a bh ’ann roimhe, mar nuair a chruthaicheas iad plugan poblach airson WordPress no ag obair le còd dìleab a chuireas bacadh air ùrachadh àrainneachd an làrach-lìn.

Anns na suidheachaidhean sin, dh ’fhaodadh sinn dòchas a thoirt seachad a bhith a’ cleachdadh a ’chòd PHP as ùire. Ach tha roghainn eile nas fheàrr: is urrainn dhuinn fhathast ar còd stòr a sgrìobhadh le PHP 8.0 agus a thionndadh gu dreach PHP roimhe - eadhon gu PHP 7.1.

San stiùireadh seo, ionnsaichidh sinn dhut a h-uile dad a dh ’fheumas tu a bhith agad mu bhith ag atharrachadh còd PHP.

Dè a th ’ann an tar-chuir?

Bidh Transpiling ag atharrachadh còd stòr bho chànan prògramaidh gu còd stòr co-ionann den aon chànan no cànan prògramaidh eadar-dhealaichte.

Chan e bun-bheachd ùr a th ’ann an transpiling taobh a-staigh leasachadh lìn: tha e coltach gum bi luchd-leasachaidh taobh cliaint eòlach air Babel, transpiler airson còd JavaScript.

Bidh Babel ag atharrachadh còd JavaScript bhon dreach ECMAScript 2015+ ùr-nodha gu dreach dìleab a tha co-chòrdail ri seann bhrobhsairean. Mar eisimpleir, le gnìomh saighead ES2015:

[2, 4, 6].map((n) => n * 2);

… Tionndaidhidh Babel an dreach ES5 aige:

[2, 4, 6].map(function(n) {
  return n * 2;
});

Dè a th ’ann an transpiling PHP?

Is e an rud a dh ’fhaodadh a bhith ùr taobh a-staigh leasachadh lìn an comas còd taobh an t-seirbheisiche a thoirt thairis, gu sònraichte PHP.

Tha Transpiling PHP ag obair san aon dòigh ri transpiling JavaScript: tha còd stòr bho dreach PHP ùr-nodha air a thionndadh gu còd co-ionnan airson dreach PHP nas sine.

A ’leantainn an aon eisimpleir ri roimhe, gnìomh saighead bho PHP 7.4:

$nums = array_map(fn($n) => $n * 2, [2, 4, 6]);

… Faodar a thionndadh a-steach don dreach PHP 7.3 co-ionann aige:

$nums = array_map(
  function ($n) {
    return $n * 2;
  },
  [2, 4, 6]
);

Faodar gnìomhan saighead a thionndadh thairis air sgàth gu bheil iad siùcar syntactic, ie co-chòrdadh ùr gus giùlan a tha ann mar-thà a thoirt gu buil. Is e seo na measan crochte ìosal.

Ach, tha feartan ùra ann cuideachd a chruthaicheas giùlan ùr, agus mar sin, cha bhi còd co-ionann ann airson dreachan roimhe de PHP. Sin a ’chùis le seòrsaichean aonaidh, air a thoirt a-steach ann am PHP 8.0:

function someFunction(float|int $param): string|float|int|null
{
  // ...
}

Anns na suidheachaidhean sin, faodar tar-chuir a dhèanamh fhathast fhad ‘s a tha feum air an fheart ùr airson leasachadh ach chan ann airson toradh. An uairsin, is urrainn dhuinn dìreach am feart a thoirt air falbh gu tur bhon chòd transpiled gun droch bhuaidhean.

Is e aon eisimpleir den leithid seòrsaichean aonaidh. Tha am feart seo air a chleachdadh gus dèanamh cinnteach nach eil mì-chothromachadh eadar an seòrsa cur-a-steach agus an luach a tha e air a thoirt seachad, a chuidicheas le bhith a ’casg bhiteagan. Ma tha strì ann le seòrsachan, bidh mearachd ann mu thràth ga leasachadh, agus bu chòir dhuinn a ghlacadh agus a chàradh mus ruig an còd cinneasachadh.

Mar sin, is urrainn dhuinn am feart a thoirt bhon chòd riochdachaidh:

function someFunction($param)
{
  // ...
}

Ma tha a ’mhearachd fhathast a’ tachairt ann an cinneasachadh, cha bhith an teachdaireachd mearachd a chaidh a thilgeil cho mionaideach na bhiodh seòrsaichean aonaidh againn. Ach, tha an ana-cothrom seo a dh ’fhaodadh a bhith nas cudromaiche na bhith comasach air seòrsachan aonaidh a chleachdadh sa chiad àite.

Ann an saoghal foirfe, bu chòir dhuinn a bhith comasach air PHP 8.0 a chleachdadh air na làraichean againn uile agus ùrachadh cho luath sa thèid dreach ùr a leigeil ma sgaoil 😌 Ach chan eil sin an-còmhnaidh. Ionnsaich a h-uile dad a dh ’fheumas tu a bhith agad mu bhith ag atharrachadh còd PHP an seo 👇Put air gu Tweet

Buannachdan Transpiling Code PHP

Tha Transpiling a ’toirt comas do dhuine tagradh a chòdachadh a’ cleachdadh an dreach as ùire de PHP agus foillseachadh a thoirt a-mach a bhios cuideachd ag obair ann an àrainneachdan a tha a ’ruith seann dhreachan de PHP.

Faodaidh seo a bhith gu sònraichte feumail do luchd-leasachaidh a ’cruthachadh thoraidhean airson siostaman riaghlaidh susbaint dìleab (CMS). Tha WordPress, mar eisimpleir, fhathast a ’toirt taic oifigeil do PHP 5.6 (eadhon ged a tha e a’ moladh PHP 7.4+). Tha an àireamh sa cheud de làraichean WordPress a tha a ’ruith tionndaidhean PHP 5.6 gu 7.2 - a tha uile Deireadh-beatha (EOL), a’ ciallachadh nach eil iad a ’faighinn ùrachaidhean tèarainteachd tuilleadh - a’ seasamh aig ìre 34.8%, agus an fheadhainn a tha a ’ruith air dreach PHP sam bith ach a-mhàin Tha 8.0 aig ìre 99.5%:

Cleachdadh WordPress a rèir dreach
Stats cleachdaidh WordPress a rèir dreach. Stòr ìomhaigh: WordPress

Mar thoradh air an sin, tha e coltach gum bi cuspairean WordPress agus plugins a tha ag amas air luchd-èisteachd cruinneil air an còdadh le seann dhreach de PHP gus an ruigsinneachd a mheudachadh. Taing gu tar-chuir, dh ’fhaodadh iad sin a bhith air an còdadh le bhith a’ cleachdadh PHP 8.0, agus fhathast air an leigeil ma sgaoil airson dreach PHP nas sine, agus mar sin a ’cuimseachadh air uimhir de luchd-cleachdaidh sa ghabhas.

Gu dearbh, faodaidh tagradh sam bith a dh ’fheumas taic a thoirt do dhreach PHP sam bith ach am fear as ùire (eadhon taobh a-staigh raon nan dreachan PHP a tha a’ faighinn taic an-dràsta) buannachd fhaighinn.

Is e seo a ’chùis le Drupal, a dh’ fheumas PHP 7.3. Taing gu tar-chuir, faodaidh luchd-leasachaidh modalan Drupal a chruthachadh a tha rim faighinn gu poblach a ’cleachdadh PHP 8.0, agus an leigeil ma sgaoil le PHP 7.3.

Is e eisimpleir eile nuair a chruthaicheas tu còd àbhaisteach airson teachdaichean nach urrainn ruith PHP 8.0 nan àrainneachdan air sgàth aon adhbhar no adhbhar. Ach a dh ’aindeoin sin, le taing dha tar-chuir, faodaidh luchd-leasachaidh fhathast na toraidhean lìbhrigidh aca a chòdachadh le bhith a’ cleachdadh PHP 8.0 agus an ruith air na h-àrainneachdan dìleab sin.

Cuin a Transpile PHP

Faodar còd PHP a thionndadh an-còmhnaidh mura h-eil feart PHP ann nach eil co-ionnan san dreach roimhe de PHP.

Is dòcha gu bheil sin fìor le buadhan, air a thoirt a-steach ann am PHP 8.0:

#[SomeAttr]
function someFunc() {}

#[AnotherAttr]
class SomeClass {}

Anns an eisimpleir nas tràithe a ’cleachdadh gnìomhan saighead, dh’ fhaodadh an còd a bhith air a thionndadh a-mach leis gu bheil gnìomhan saighead siùcar syntactic. Tha buadhan, an aghaidh sin, a ’cruthachadh giùlan gu tur ùr. Dh ’fhaodadh an giùlan seo a bhith air ath-riochdachadh le PHP 7.4 agus gu h-ìosal, ach dìreach le bhith ga chòdachadh le làimh, ie chan ann gu fèin-ghluasadach stèidhichte air inneal no pròiseas (dh’ fhaodadh AI fuasgladh a thoirt seachad, ach chan eil sinn ann fhathast).

Feartan a thathar an dùil a chleachdadh airson leasachadh, leithid #[Deprecated], faodar a thoirt air falbh san aon dòigh sa thèid seòrsaichean aonaidh a thoirt air falbh. Ach chan urrainnear feartan a tha ag atharrachadh giùlan an tagraidh ann an cinneasachadh a thoirt air falbh, agus chan urrainnear an toirt thairis gu dìreach an dàrna cuid.

Mar an latha an-diugh, chan urrainn do transpiler sam bith còd a ghabhail le buadhan PHP 8.0 agus an còd PHP 7.4 co-ionann aige a thoirt gu buil. Mar thoradh air an sin, ma dh ’fheumas do chòd PHP buadhan a chleachdadh, bidh e duilich no do-dhèanta an uairsin a thionndadh.

Feartan PHP a ghabhas atharrachadh

Is iad sin na feartan bho PHP 7.1 agus gu h-àrd a ghabhas an-dràsta. Mura cleachd an còd agad na feartan sin a-mhàin, faodaidh tu a bhith cinnteach gun obraich an tagradh transpiled agad. Rud eile, feumaidh tu measadh a dhèanamh an toir an còd a chaidh a thoirt thairis fàiligeadh.

Tionndadh PHPfeartan
7.1Everything
7.2- object seòrsa
- leudachadh seòrsa paramadair
- PREG_UNMATCHED_AS_NULL bratach a-steach preg_match
7.3- Sònrachaidhean iomraidh ann an list() / sgrios millteach (Ach a-staigh foreach - # 4376)
- Co-chòrdadh sùbailte Heredoc agus Nowdoc
- A ’slaodadh cromagan ann an gairmean dhreuchdan
- set(raw)cookie a ’gabhail ri argamaid roghainn $
7.4- Togalaichean clò-sgrìobhte
- Gnìomhan saighead
- Gnìomhaiche sònrachadh co-thaobhadh Null
- A ’dì-phapadh taobh a-staigh arrays
- Dealaiche litearra àireamhach
- strip_tags() le sreath de ainmean taga
- seòrsaichean tilleadh covariant agus seòrsachan paramadair contravariant
8.0- Seòrsaichean aonaidh
- mixed seòrsa fuadain
- static seòrsa tilleadh
- ::class draoidheachd seasmhach air nithean
- match abairtean
- catch eisgeachdan a-mhàin a rèir seòrsa
- Gnìomhaiche sàbhailte-sàbhailte
- Brosnachadh togail neach-togail clas
- A ’slaodadh cromagan ann an liostaichean paramadair agus dùnadh use liostaichean

Transpilers PHP

An-dràsta, tha aon inneal ann airson còd PHP a thoirt thairis: Reachdadair.

Tha Rector na inneal ath-thogail PHP, a bhios ag atharrachadh còd PHP stèidhichte air riaghailtean prògramaichte. Bidh sinn a ’cuir a-steach an còd stòr agus an seata de riaghailtean ri ruith, agus bidh Rector ag atharrachadh a’ chòd.

Tha ceannard ag obair tro loidhne-àithne, air a chuir a-steach sa phròiseact tro Sgrìobhaiche-ciùil. Nuair a thèid a chur gu bàs, bheir Rector a-mach “diff” (cur-ris ann an uaine, toirt air falbh ann an dearg) den chòd ro agus às deidh a thionndadh:

toradh "diff" bhon Cheannard
Toradh “diff” bhon Cheannard

Dè an dreach de PHP ri Transpile gu

Gus còd a thionndadh thairis air dreachan PHP, feumar na riaghailtean co-fhreagarrach a chruthachadh.

An-diugh, tha leabharlann an Reachdadair a ’toirt a-steach a’ mhòr-chuid de na riaghailtean airson còd ath-chuir taobh a-staigh raon PHP 8.0 gu 7.1. Mar sin, is urrainn dhuinn ar còd PHP a ghluasad gu earbsach cho fada sìos ri dreach 7.1.

Tha riaghailtean ann cuideachd airson tar-chuir bho PHP 7.1 gu 7.0 agus bho 7.0 gu 5.6, ach chan eil iad sin uile-chuimseach. Tha obair a ’dol air adhart gus an crìochnachadh, agus mar sin is dòcha gun cuir sinn còd PHP sìos gu dreach 5.6.

Eadar-ghluasad vs Backporting

Tha backporting coltach ri tar-chuir, ach nas sìmplidh. Chan fheum còd backporting a bhith an urra ri feartan ùra bho chànan. An àite sin, faodar an aon ghoireas a thoirt do dhreach nas sine den chànan dìreach le bhith a ’dèanamh copaidh / pasting / ag atharrachadh a’ chòd fhreagarrach bhon dreach ùr den chànan.

Mar eisimpleir, an gnìomh str_contains chaidh a thoirt a-steach ann am PHP 8.0. Faodar an aon ghnìomh airson PHP 7.4 agus gu h-ìosal a chuir an gnìomh gu furasta mar seo:

if (!defined('PHP_VERSION_ID') || (defined('PHP_VERSION_ID') && PHP_VERSION_ID < 80000)) {
  if (!function_exists('str_contains')) {
    /**
     * Checks if a string contains another
     *
     * @param string $haystack The string to search in
     * @param string $needle The string to search
     * @return boolean Returns TRUE if the needle was found in haystack, FALSE otherwise.
     */
    function str_contains(string $haystack, string $needle): bool
    {
      return strpos($haystack, $needle) !== false;
    }
  }
}

Leis gu bheil backporting nas sìmplidh na transpiling, bu chòir dhuinn am fuasgladh seo a thaghadh nuair a bhios backporting a ’dèanamh an obair.

A thaobh an raon eadar PHP 8.0 gu 7.1, is urrainn dhuinn leabharlannan polyfill Symfony a chleachdadh:

  • Polyfill PHP 7.1
  • Polyfill PHP 7.2
  • Polyfill PHP 7.3
  • Polyfill PHP 7.4
  • Polyfill PHP 8.0

Tha na leabharlannan sin a ’dèanamh cùl-taic de na gnìomhan, clasaichean, cunbhalachd agus eadar-aghaidh a leanas:

Tionndadh PHPfeartan
7.2gnìomhan:

  • spl_object_id
  • utf8_encode
  • utf8_decode

Constants:

  • PHP_FLOAT_*
  • PHP_OS_FAMILY
7.3gnìomhan:

  • array_key_first
  • array_key_last
  • hrtime
  • is_countable

Eisgeachdan:

  • JsonException
7.4gnìomhan:

  • get_mangled_object_vars
  • mb_str_split
  • password_algos
8.0Eadar-aghaidh:

  • Stringable

Clasaichean:

  • ValueError
  • UnhandledMatchError

Constants:

  • FILTER_VALIDATE_BOOL

gnìomhan:

  • fdiv
  • get_debug_type
  • preg_last_error_msg
  • str_contains
  • str_starts_with
  • str_ends_with
  • get_resource_id

Eisimpleirean de PHP Transpiled

Feuch an dèan sinn sgrùdadh air beagan eisimpleirean de chòd PHP a chaidh a thoirt thairis, agus beagan phasgan a tha air an toirt thairis gu h-iomlan.

Còd PHP

Tha match chaidh faireachdainn a thoirt a-steach ann am PHP 8.0. An còd stòr seo:

function getFieldValue(string $fieldName): ?string
{
  return match($fieldName) {
    'foo' => 'foofoo',
    'bar' => 'barbar',
    'baz' => 'bazbaz',
    default => null,
  };
}

… Thèid a thionndadh chun dreach PHP 7.4 co-ionann, a ’cleachdadh an switch ghnìomhaiche:

function getFieldValue(string $fieldName): ?string
{
  switch ($fieldName) {
    case 'foo':
      return 'foofoo';
    case 'bar':
      return 'barbar';
    case 'baz':
      return 'bazbaz';
    default:
      return null;
  }
}

Chaidh an gnìomhaiche nullsafe a thoirt a-steach cuideachd ann am PHP 8.0:

public function getValue(TypeResolverInterface $typeResolver): ?string
{
  return $this->getResolver($typeResolver)?->getValue();
}

Feumaidh an còd transpiled luach na h-obrach a shònrachadh do chaochladair ùr an toiseach, gus nach cuir thu an gnìomh an gnìomh dà uair:

public function getValue(TypeResolverInterface $typeResolver): ?string
{
  return ($val = $this->getResolver($typeResolver)) ? $val->getValue() : null;
}

Tha feart brosnachadh seilbh an neach-togail, a chaidh a thoirt a-steach cuideachd ann am PHP 8.0, a ’leigeil le luchd-leasachaidh nas lugha de chòd a sgrìobhadh:

class QueryResolver
{
  function __construct(protected QueryFormatter $queryFormatter)
  {
  }
}

Nuair a tha e ga atharrachadh airson PHP 7.4, tha am pìos làn chòd air a thoirt a-mach:

 class QueryResolver
 {
  protected QueryFormatter $queryFormatter;

  function __construct(QueryFormatter $queryFormatter)
  {
    $this->queryFormatter = $queryFormatter;
  }
}

Anns a ’chòd transpiled gu h-àrd tha togalaichean clò-sgrìobhte, a chaidh a thoirt a-steach ann am PHP 7.4. Le bhith a ’gluasad a’ chòd sin sìos gu PHP 7.3 tha docblocks nan àite:

 class QueryResolver
 {
  /**
   * @var QueryFormatter
   */
  protected $queryFormatter;

  function __construct(QueryFormatter $queryFormatter)
  {
    $this->queryFormatter = $queryFormatter;
  }
}

Pasganan PHP

Thathar a ’gluasad na leabharlannan a leanas airson toradh:

Leabharlann / tuairisgeulCòd / notaichean
Reachdadair
Inneal ath-thogail PHP a nì tar-chuir comasach
- Còd stòr
- Còd tar-chuir
- Notaichean
Ìrean còdaidh furasta
Inneal airson còd PHP a bhith a ’cumail ri seata de riaghailtean
- Còd stòr
- Còd tar-chuir
- Notaichean
GraphQL API airson WordPress
Plugin a ’toirt seachad frithealaiche GraphQL airson WordPress
- Còd stòr
- Còd tar-chuir
- Notaichean

Pros agus Cons de Transpiling PHP

Chaidh iomradh a thoirt air a ’bhuannachd a tha ann a bhith ag atharrachadh PHP mu thràth: leigidh e leis a’ chòd stòr PHP 8.0 (ie an dreach as ùire de PHP) a chleachdadh, a thèid atharrachadh gu dreach nas ìsle airson PHP airson toradh a ruith ann an tagradh no àrainneachd dìleab.

Tha seo gu h-èifeachdach a ’leigeil leinn a bhith nan luchd-leasachaidh nas fheàrr, a’ dèanamh còd le càileachd nas àirde. Tha seo air sgàth ‘s gum faod an còd stòr againn seòrsachan aonaidh PHP 8.0 a chleachdadh, togalaichean clò-sgrìobhte PHP 7.4, agus na diofar sheòrsaichean agus seòrsaichean fuadain air an cur ri gach dreach ùr de PHP (mixed bho PHP 8.0, object bho PHP 7.2), am measg feartan ùr-nodha eile de PHP.

A ’cleachdadh nam feartan sin, is urrainn dhuinn biastagan a ghlacadh nas fheàrr rè leasachadh agus còd a sgrìobhadh a tha nas fhasa a leughadh.

A-nis, leig dhuinn sùil a thoirt air na h-eas-bhuannachdan.

Feumar a chòdachadh agus a chumail suas

Faodaidh an ceannard còd a ghluasad gu fèin-ghluasadach, ach tha coltas ann gum feum am pròiseas beagan taic làimhe gus toirt air obrachadh leis an t-suidheachadh sònraichte againn.

Feumar leabharlannan treas-phàrtaidh a thar-chuir cuideachd

Bidh seo na chùis nuair a bhios iad gan gluasad a ’dèanamh mhearachdan oir feumaidh sinn an uairsin sgrùdadh a dhèanamh air a’ chòd stòr aca gus faighinn a-mach an adhbhar a dh ’fhaodadh a bhith ann. Mas urrainnear a ’chùis a rèiteach agus gu bheil am pròiseact fosgailte, feumaidh sinn iarrtas tarraing a-steach. Mura h-eil an leabharlann fosgailte, dh ’fhaodadh sinn bualadh air rathad.

Chan eil an ceannard ag innse dhuinn nuair nach urrainnear an còd a thoirt thairis

Ma tha buadhan PHP 8.0 anns a ’chòd stòr no feart sam bith eile nach gabh a thionndadh, chan urrainn dhuinn a dhol air adhart. Ach, cha toir Rector sùil air a ’chumha seo, mar sin feumaidh sinn a dhèanamh le làimh. Is dòcha nach e duilgheadas mòr a tha seo a thaobh a ’chòd stòr againn fhèin oir tha sinn eòlach air mu thràth, ach dh’ fhaodadh e a bhith na chnap-starra a thaobh eisimeileachd treas-phàrtaidh.

Bidh fiosrachadh debugging a ’cleachdadh a’ chòd transpiled, chan e an còd stòr

Nuair a bheir an tagradh teachdaireachd mearachd le lorg cruachan ann an cinneasachadh, comharraichidh an àireamh loidhne ris a ’chòd a chaidh a ghluasad. Feumaidh sinn tionndadh air ais bho transpiled gu còd tùsail gus an àireamh loidhne co-fhreagarrach a lorg anns a ’chòd stòr.

Feumar an còd transpiled a bhith ro-leasaichte cuideachd

Dh ’fhaodadh ar pròiseact tar-chuir agus cuid de leabharlannan eile a chaidh a chuir a-steach san àrainneachd riochdachaidh an aon eisimeileachd treas-phàrtaidh a chleachdadh. Thèid an eisimeileachd treas-phàrtaidh seo a thoirt thairis airson a ’phròiseict againn agus cumaidh e a’ chòd stòr tùsail airson an leabharlann eile. Mar sin, feumar an dreach a chaidh a thoirt a-steach a chuir ro-làimh tro PHP-Scoper, Strauss, no inneal eile gus còmhstrithean a dh’fhaodadh a bhith ann a sheachnadh.

Feumaidh Transpiling tachairt rè amalachadh leantainneach (CI)

Leis gum bi an còd transpiled gu nàdarra a ’dol thairis air a’ chòd stòr, cha bu chòir dhuinn am pròiseas tar-chuir a ruith air na coimpiutairean leasachaidh againn, no bidh cunnart ann gun cruthaich sinn frith-bhuaidhean. Tha e nas freagarraiche a bhith a ’ruith a’ phròiseas rè ruith CI (barrachd air seo gu h-ìosal).

Mar a nì thu tar-chuir PHP

An toiseach, feumaidh sinn Reachdadair a chuir a-steach don phròiseact againn airson leasachadh:

composer require rector/rector --dev

Bidh sinn an uairsin a ’cruthachadh a rector.php faidhle rèiteachaidh ann am bun-eòlaire a ’phròiseict anns a bheil na seataichean riatanach de riaghailtean. Gus an còd ìsleachadh bho PHP 8.0 gu 7.1, cleachdaidh sinn an config seo:

use RectorSetValueObjectDowngradeSetList;
use SymfonyComponentDependencyInjectionLoaderConfiguratorContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
    $containerConfigurator->import(DowngradeSetList::PHP_80);
    $containerConfigurator->import(DowngradeSetList::PHP_74);
    $containerConfigurator->import(DowngradeSetList::PHP_73);
    $containerConfigurator->import(DowngradeSetList::PHP_72);
};

Gus dèanamh cinnteach gu bheil am pròiseas a ’coileanadh mar a bhiodh dùil, is urrainn dhuinn Reachdadairean a ruith process àithne ann am modh tioram, a ’dol seachad air an àite / na h-àiteachan airson pròiseasadh (sa chùis seo, a h-uile faidhle fon phasgan src/):

vendor/bin/rector process src --dry-run

Gus an tar-chuir a dhèanamh, bidh sinn a ’ruith Rector's process àithne, a nì atharrachadh air na faidhlichean san àite a th ’aca:

vendor/bin/rector process src

Thoir fa-near: ma ruitheas sinn rector process anns na coimpiutairean leasachaidh againn, thèid an còd stòr a thionndadh na àite, fo src/. Ach, tha sinn airson an còd a chaidh a thionndadh a thoirt gu buil ann an àite eadar-dhealaichte gun a bhith a ’dol thairis air a’ chòd stòr nuair a bhios tu ag ìsleachadh còd. Air an adhbhar seo, tha ruith a ’phròiseas as freagarraiche rè amalachadh leantainneach.

A ’dèanamh feum as fheàrr den phròiseas tar-chuir

Gus liubhairt lìbhrigidh a ghineadh airson cinneasachadh, chan fheumar ach an còd riochdachaidh a thionndadh; faodar còd a tha a dhìth airson leasachadh a-mhàin. Tha sin a ’ciallachadh gun urrainn dhuinn a h-uile deuchainn a sheachnadh (airson gach cuid ar pròiseact agus an eisimeileachd) agus gach eisimeileachd airson leasachadh.

A thaobh deuchainnean, bidh fios againn mu thràth càite a bheil an fheadhainn airson a ’phròiseict againn - mar eisimpleir, fon phasgan tests/. Feumaidh sinn cuideachd faighinn a-mach càite a bheil an fheadhainn airson eisimeileachd - mar eisimpleir, fo na fo-fhònaichean aca tests/, test/ agus Test/ (airson diofar leabharlannan). An uairsin, bidh sinn ag iarraidh air Rector sgiobadh a bhith a ’giullachd nam pasganan sin:

return static function (ContainerConfigurator $containerConfigurator): void {
  // ...

  $parameters->set(Option::SKIP, [
    // Skip tests
    '*/tests/*',
    '*/test/*',
    '*/Test/*',
  ]);
};

A thaobh eisimeileachd, tha fios aig an sgrìobhaiche-ciùil dè an fheadhainn a tha ann airson leasachadh (an fheadhainn a tha fo inntrigeadh require-dev in composer.json) agus dè an fheadhainn a tha ri riochdachadh (an fheadhainn a tha fo inntrigeadh require).

Gus faighinn air ais bho Sgrìobhaiche-ciùil slighean gach eisimeileachd airson cinneasachadh, ruith sinn:

composer info --path --no-dev

Bheir an àithne seo liosta de eisimeileachd leis an ainm agus an t-slighe aca, mar seo:

brain/cortex                     /Users/leo/GitHub/leoloso/PoP/vendor/brain/cortex
composer/installers              /Users/leo/GitHub/leoloso/PoP/vendor/composer/installers
composer/semver                  /Users/leo/GitHub/leoloso/PoP/vendor/composer/semver
guzzlehttp/guzzle                /Users/leo/GitHub/leoloso/PoP/vendor/guzzlehttp/guzzle
league/pipeline                  /Users/leo/GitHub/leoloso/PoP/vendor/league/pipeline

Faodaidh sinn na slighean uile a thoirt a-mach agus am biathadh a-steach do àithne an Reachdair, a bhios an uairsin a ’pròiseasadh ar pròiseactan src/ pasgan a bharrachd air na pasganan sin anns a bheil gach eisimeileachd airson cinneasachadh:

$ paths="$(composer info --path --no-dev | cut -d' ' -f2- | sed 's/ //g' | tr 'n' ' ')"
$ vendor/bin/rector process src $paths

Faodaidh leasachadh eile casg a chur air Ceannard-sgoile bho bhith a ’giullachd nan eisimeileachd sin a tha mar-thà a’ cleachdadh an dreach PHP targaid. Ma chaidh leabharlann a chòdachadh le PHP 7.1 (no dreach sam bith gu h-ìosal), cha leigear a leas a ghluasad gu PHP 7.1.

Gus seo a choileanadh, is urrainn dhuinn liosta nan leabharlannan fhaighinn a dh ’fheumas PHP 7.2 agus gu h-àrd agus a’ pròiseasadh dìreach an fheadhainn sin. Gheibh sinn ainmean nan leabharlannan sin gu lèir tro Composer's why-not àithne, mar seo:

composer why-not php "7.1.*" | grep -o "S*/S*"

Leis nach eil an àithne seo ag obair leis an --no-dev bratach, gus a bhith a ’toirt a-steach dìreach eisimeileachd airson cinneasachadh, feumaidh sinn an toiseach na h-eisimeileachd airson leasachadh a thoirt air falbh agus an autoloader ath-nuadhachadh, an àithne a chuir an gnìomh, agus an uairsin a chuir a-rithist:

$ composer install --no-dev
$ packages=$(composer why-not php "7.1.*" | grep -o "S*/S*")
$ composer install

Sgrìobhaiche-ciùil info --path bidh àithne a ’faighinn air ais an t-slighe airson pasgan, leis a’ chruth seo:

# Executing this command
$ composer info psr/cache --path   
# Produces this response:
psr/cache /Users/leo/GitHub/leoloso/PoP/vendor/psr/cache

Bidh sinn a ’cur an gnìomh an àithne seo airson gach nì air an liosta againn gus a h-uile slighe fhaighinn gu transpile:

A bheil feum agad air fuasgladh aoigheachd a bheir buannachd farpaiseach dhut? Behmaster's e air do chòmhdach le astar iongantach, tèarainteachd ùr-nodha, agus fèin-sgèileadh. Thoir sùil air na planaichean againn

for package in $packages
do
  path=$(composer info $package --path | cut -d' ' -f2-)
  paths="$paths $path"
done

Mu dheireadh, tha sinn a ’toirt seachad an liosta seo don Cheannard (a bharrachd air liostaichean a’ phròiseict src/ pasgan):

vendor/bin/rector process src $paths

Duilgheadasan ri sheachnadh nuair a thèid an còd atharrachadh

Dh ’fhaodadh còd tar-chuir a bhith air a mheas mar ealain, gu tric a’ feumachdainn tweaks a tha sònraichte don phròiseact. Chì sinn beagan dhuilgheadasan a dh ’fhaodadh sinn a thighinn a-steach.

Chan eil riaghailtean slabhraidh an-còmhnaidh air an giullachd

Is e riaghailt slabhraidh nuair a dh ’fheumas riaghailt an còd a chaidh a thoirt a-mach le riaghailt roimhe seo a thionndadh.

Mar eisimpleir, leabharlann symfony/cache tha an còd seo:

final class CacheItem implements ItemInterface
{
  public function tag($tags): ItemInterface
  {
    // ...
    return $this;
  }
}

Nuair a thèid thu thairis bho PHP 7.4 gu 7.3, gnìomh tag feumar dà atharrachadh a dhèanamh:

  • An seòrsa tilleadh ItemInterface feumar atharrachadh an toiseach gu self, air sgàth riaghailt DowngradeCovariantReturnTypeRector
  • An seòrsa tilleadh self feumar an uairsin a thoirt air falbh, air sgàth riaghailt DowngradeSelfTypeDeclarationRector

Bu chòir an toradh deireannach a bhith mar seo:

final class CacheItem implements ItemInterface
{
  public function tag($tags)
  {
    // ...
    return $this;
  }
}

Ach, chan eil an ceannard a ’toirt a-mach ach an ìre eadar-mheadhanach:

final class CacheItem implements ItemInterface
{
  public function tag($tags): self
  {
    // ...
    return $this;
  }
}

Is e a ’cheist nach urrainn don Cheannard smachd a chumail air an òrdugh anns a bheil na riaghailtean air an cur an sàs.

Is e am fuasgladh a bhith a ’comharrachadh dè na riaghailtean slabhraidh a chaidh fhàgail gun phròiseas, agus ruith Reachdadair ùr a chuir an gnìomh gus an cur an sàs.

Gus na riaghailtean slabhraidh a chomharrachadh, bidh sinn a ’ruith Reachdadair dà uair air a’ chòd stòr, mar seo:

$ vendor/bin/rector process src
$ vendor/bin/rector process src --dry-run

A ’chiad uair, bidh sinn a’ ruith Rector mar a bhiodh dùil, gus an tar-chuir a chuir gu bàs. An dàrna turas, cleachdaidh sinn an --dry-run bratach gus faighinn a-mach a bheil atharrachaidhean ri dhèanamh fhathast. Ma tha, falbhaidh an àithne le còd mearachd, agus seallaidh an toradh “diff” dè an riaghailt / na riaghailtean a ghabhas cur an sàs fhathast. Bhiodh sin a ’ciallachadh nach robh a’ chiad ruith coileanta, le cuid de riaghailt slabhraidh gun a bhith air an giullachd.

Reachdadair ruith le bratach --dry-run
Reachdadair ruith le bratach air a ruith le tioram

Aon uair ‘s gu bheil sinn air an riaghailt (no na riaghailtean) le slabhraidhean neo-leasaichte a chomharrachadh, faodaidh sinn an uairsin faidhle config Rector eile a chruthachadh - mar eisimpleir, rector-chained-rule.php cuiridh e an gnìomh an riaghailt a tha a dhìth. An àite a bhith a ’giullachd làn sheata de riaghailtean airson a h-uile faidhle fo src/, an turas seo, is urrainn dhuinn an riaghailt shònraichte a tha a dhìth a ruith air an fhaidhle sònraichte far am feumar a chuir an sàs:

// rector-chained-rule.php
use RectorCoreConfigurationOption;
use RectorDowngradePhp74RectorClassMethodDowngradeSelfTypeDeclarationRector;
use SymfonyComponentDependencyInjectionLoaderConfiguratorContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
  $services = $containerConfigurator->services();
  $services->set(DowngradeSelfTypeDeclarationRector::class);

  $parameters = $containerConfigurator->parameters();
  $parameters->set(Option::PATHS, [
    __DIR__ . '/vendor/symfony/cache/CacheItem.php',
  ]);
};

Mu dheireadh, tha sinn ag innse do Rector air an dàrna pas aige am faidhle config ùr a chleachdadh le cuir a-steach --config:

# First pass with all modifications
$ vendor/bin/rector process src

# Second pass to fix a specific problem
$ vendor/bin/rector process --config=rector-chained-rule.php

Faodaidh eisimeileachd sgrìobhaiche a bhith neo-chunbhalach

Dh ’fhaodadh leabharlannan foillseachadh eisimeileachd a bhith air a sglèatadh airson leasachadh (ie fo require-dev in composer.json), ach fhathast, thoir iomradh air cuid de chòd bhuapa airson a thoirt gu buil (mar air cuid de na faidhlichean fo src/, chan ann tests/).

Mar as trice, chan eil seo na dhuilgheadas oir is dòcha nach tèid an còd sin a luchdachadh air cinneasachadh, agus mar sin cha bhi mearachd ann air an tagradh. Ach, nuair a bhios Rector a ’giullachd a’ chòd stòr agus na h-eisimeileachd, bidh e a ’dearbhadh gum faodar a h-uile còd air a bheil iomradh a luchdachadh. Tilgidh an ceannard mearachd ma tha faidhle sam bith a ’toirt iomradh air pìos de chòd bho leabharlann neo-stàlaichte (oir chaidh a dhearbhadh gun robh feum air airson leasachadh a-mhàin).

Mar eisimpleir, clas EarlyExpirationHandler bho Symfony's Cache a ’cur an gnìomh eadar-aghaidh MessageHandlerInterface bhon phàirt Messenger:

class EarlyExpirationHandler implements MessageHandlerInterface
{
    //...
}

Ge-tà, symfony/cache a ’nochdadh symfony/messenger a bhith an urra ri leasachadh. An uairsin, nuair a bhios tu a ’ruith Rector air pròiseact a tha an urra symfony/cache, tilgidh e mearachd:

[ERROR] Could not process "vendor/symfony/cache/Messenger/EarlyExpirationHandler.php" file, due to:             
  "Analyze error: "Class SymfonyComponentMessengerHandlerMessageHandlerInterface not found.". Include your files in "$parameters->set(Option::AUTOLOAD_PATHS, [...]);" in "rector.php" config.
  See https://github.com/rectorphp/rector#configuration".   

Tha trì fuasglaidhean ann don chùis seo:

  1. Ann an rèiteachadh an Reachdadair, sgiob a ’giullachd an fhaidhle a tha a’ toirt iomradh air a ’phìos còd sin:
return static function (ContainerConfigurator $containerConfigurator): void {
  // ...

  $parameters->set(Option::SKIP, [
    __DIR__ . '/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php',
  ]);
};
  1. Luchdaich sìos an leabharlann a tha a dhìth agus cuir ris a shlighe gus a bhith fèin-luchdaichte le Reachdadair:
return static function (ContainerConfigurator $containerConfigurator): void {
  // ...

  $parameters->set(Option::AUTOLOAD_PATHS, [
    __DIR__ . '/vendor/symfony/messenger',
  ]);
};
  1. Thoir air do phròiseact a bhith an urra ris an leabharlann a tha a dhìth airson toradh:
composer require symfony/messenger

Eadar-theangachadh agus amalachadh leantainneach

Mar a chaidh a ràdh roimhe seo, anns na coimpiutairean leasachaidh againn feumaidh sinn an --dry-run bratach nuair a bhios tu a ’ruith Reachdadair, no eile, thèid an còd stòr a thoirt thairis leis a’ chòd a chaidh a ghluasad. Air an adhbhar seo, tha e nas freagarraiche am pròiseas tar-chuiridh a ruith rè amalachadh leantainneach (CI), far am faod sinn ruitheadairean sealach a shnìomh gus am pròiseas a chuir an gnìomh.

Is e àm air leth freagarrach airson a ’phròiseas tar-chuir a chuir an gnìomh nuair a tha e a’ gineadh sgaoileadh airson a ’phròiseict againn. Mar eisimpleir, tha an còd gu h-ìosal na shruth-obrach airson GitHub Actions, a tha a ’cruthachadh sgaoileadh plugan WordPress:

name: Generate Installable Plugin and Upload as Release Asset
on:
  release:
    types: [published]
jobs:
  build:
    name: Build, Downgrade and Upload Release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Downgrade code for production (to PHP 7.1)
        run: |
          composer install
          vendor/bin/rector process
          sed -i 's/Requires PHP: 7.4/Requires PHP: 7.1/' graphql-api.php
      - name: Build project for production
        run: |
          composer install --no-dev --optimize-autoloader
          mkdir build
      - name: Create artifact
        uses: montudor/action-zip@v0.1.0
        with:
          args: zip -X -r build/graphql-api.zip . -x *.git* node_modules/* .* "*/.*" CODE_OF_CONDUCT.md CONTRIBUTING.md ISSUE_TEMPLATE.md PULL_REQUEST_TEMPLATE.md rector.php *.dist composer.* dev-helpers** build**
      - name: Upload artifact
        uses: actions/upload-artifact@v2
        with:
            name: graphql-api
            path: build/graphql-api.zip
      - name: Upload to release
        uses: JasonEtco/upload-to-release@master
        with:
          args: build/graphql-api.zip application/zip
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Tha modh-obrach àbhaisteach anns an t-sruth-obrach seo gus plugan WordPress a leigeil ma sgaoil tro GitHub Actions. Tha an cur-ris ùr, gus còd a ’phlug a ghluasad bho PHP 7.4 gu 7.1, a’ tachairt sa cheum seo:

      - name: Downgrade code for production (to PHP 7.1)
        run: |
          vendor/bin/rector process
          sed -i 's/Requires PHP: 7.4/Requires PHP: 7.1/' graphql-api.php

Air an toirt còmhla, tha an sruth-obrach seo a-nis a ’coileanadh nan ceumannan a leanas:

  1. A ’sgrùdadh a’ chòd stòr airson plugan WordPress bhon ionad-tasgaidh aige, sgrìobhte le PHP 7.4
  2. A ’stàladh eisimeileachd a’ Cho-sgrìobhaiche
  3. Ag atharrachadh a chòd bho PHP 7.4 gu 7.1
  4. Bidh e ag atharrachadh inntrigeadh “Feumach PHP” ann am bann-cinn prìomh fhaidhle a ’phlug bho "7.4" gu "7.1"
  5. A ’toirt air falbh na h-eisimeileachd a dh’ fheumar airson leasachadh
  6. A ’cruthachadh faidhle .zip a’ phlug, às aonais a h-uile faidhle unneeded
  7. A ’luchdachadh suas am faidhle .zip mar mhaoin sgaoilidh (agus, a bharrachd air sin, mar artifact gu Gnìomh GitHub)

A ’dèanamh deuchainn air a’ Chòd Transpiled

Aon uair ‘s gu bheil an còd air a thionndadh gu PHP 7.1, ciamar a tha fios againn gu bheil e ag obair gu math? No, ann am faclan eile, ciamar a tha fios againn gu bheil e air a thionndadh gu mionaideach, agus nach deach fuigheall de dhreachan nas àirde de chòd PHP fhàgail?

Coltach ri bhith ag atharrachadh a ’chòd, is urrainn dhuinn am fuasgladh a bhuileachadh taobh a-staigh pròiseas CI. Is e am beachd àrainneachd an ruitheadair a stèidheachadh le PHP 7.1 agus linter a ruith air a ’chòd transpiled. Mura h-eil pìos còd sam bith co-chòrdail ri PHP 7.1 (leithid togalach clò-bhuailte bho PHP 7.4 nach deach a thionndadh), tilgidh an linter mearachd.

Is e sreath airson PHP a tha ag obair gu math PHP Parallel Lint. Faodaidh sinn an leabharlann seo a chuir an sàs mar eisimeileachd airson leasachadh sa phròiseact againn, no pròiseas CI a chuir a-steach mar phròiseact Sgrìobhaiche-ciùil neo-eisimeileach:

composer create-project php-parallel-lint/php-parallel-lint

Nuair a bhios PHP 7.2 agus gu h-àrd anns a ’chòd, tilgidh PHP Parallel Lint mearachd mar an tè seo:

Run php-parallel-lint/parallel-lint layers/ vendor/ --exclude vendor/symfony/polyfill-ctype/bootstrap80.php --exclude vendor/symfony/polyfill-intl-grapheme/bootstrap80.php --exclude vendor/symfony/polyfill-intl-idn/bootstrap80.php --exclude vendor/symfony/polyfill-intl-normalizer/bootstrap80.php --exclude vendor/symfony/polyfill-mbstring/bootstrap80.php
PHP 7.1.33 | 10 parallel jobs
............................................................   60/2870 (2 %)
............................................................  120/2870 (4 %)
...
............................................................  660/2870 (22 %)
.............X..............................................  720/2870 (25 %)
............................................................  780/2870 (27 %)
...
............................................................ 2820/2870 (98 %)
..................................................           2870/2870 (100 %)


Checked 2870 files in 15.4 seconds
Syntax error found in 1 file

------------------------------------------------------------
Parse error: layers/GraphQLAPIForWP/plugins/graphql-api-for-wp/graphql-api.php:55
    53|     '0.8.0',
    54|     __('GraphQL API for WordPress', 'graphql-api'),
  > 55| ))) {
    56|     $plugin->setup();
    57| }
Unexpected ')' in layers/GraphQLAPIForWP/plugins/graphql-api-for-wp/graphql-api.php on line 55
Error: Process completed with exit code 1.

Nach cuir sinn an linter a-steach do shruth-obrach an CI againn. Is iad na ceumannan gus còd transpile a chuir an gnìomh bho PHP 8.0 gu 7.1 agus deuchainn a dhèanamh air:

  1. Thoir sùil air a ’chòd stòr
  2. Thoir air an àrainneachd ruith PHP 8.0, gus an urrainn don Cheannard an còd stòr a mhìneachadh
  3. Transpile an còd gu PHP 7.1
  4. Stàlaich an inneal linter PHP
  5. Atharraich dreach PHP na h-àrainneachd gu 7.1
  6. Ruith an linter air a ’chòd transpiled

Bidh an sruth-obrach GitHub Action seo a ’dèanamh an obair:

name: Downgrade PHP tests
jobs:
  main:
    name: Downgrade code to PHP 7.1 via Rector, and execute tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set-up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: 8.0
          coverage: none

      - name: Local packages - Downgrade PHP code via Rector
        run: |
          composer install
          vendor/bin/rector process

      # Prepare for testing on PHP 7.1
      - name: Install PHP Parallel Lint
        run: composer create-project php-parallel-lint/php-parallel-lint --ansi

      - name: Switch to PHP 7.1
        uses: shivammathur/setup-php@v2
        with:
          php-version: 7.1
          coverage: none

      # Lint the transpiled code
      - name: Run PHP Parallel Lint on PHP 7.1
        run: php-parallel-lint/parallel-lint src/ vendor/ --exclude vendor/symfony/polyfill-ctype/bootstrap80.php --exclude vendor/symfony/polyfill-intl-grapheme/bootstrap80.php --exclude vendor/symfony/polyfill-intl-idn/bootstrap80.php --exclude vendor/symfony/polyfill-intl-normalizer/bootstrap80.php --exclude vendor/symfony/polyfill-mbstring/bootstrap80.php

Thoir fa-near gu bheil grunn bootstrap80.php feumaidh faidhlichean bho leabharlannan polyfill Symfony (nach fheum a bhith air an tar-chuir) a bhith air an dùnadh a-mach bhon t-sreath. Tha PHP 8.0 anns na faidhlichean sin, agus mar sin thilgeadh an linter mearachdan nuair a bhios iad gan giullachd. Ach, tha a bhith a ’dùnadh a-mach na faidhlichean sin sàbhailte oir thèid an luchdachadh air cinneasachadh a-mhàin nuair a bhios iad a’ ruith PHP 8.0 no nas àirde:

if (PHP_VERSION_ID >= 80000) {
  return require __DIR__.'/bootstrap80.php';
}

Co-dhiù a tha thu a ’cruthachadh plugan poblach airson WordPress no a bheil thu ag ùrachadh còd dìleab, tha mòran adhbharan ann gum faodadh e bhith do-dhèanta an dreach PHP as ùire a chleachdadh 👩‍💻 Ionnsaich mar as urrainn do transpiling cuideachadh san stiùireadh seo 👇Put air gu Tweet

Geàrr-chunntas

Dh'ionnsaich an artaigil seo dhuinn mar a dh ’atharraicheas sinn ar còd PHP, a’ leigeil leinn PHP 8.0 a chleachdadh sa chòd stòr agus brath a chruthachadh a bhios ag obair air PHP 7.1. Tha tar-chur air a dhèanamh tro Rector, inneal ath-thogail PHP.

Le bhith ag atharrachadh a ’chòd againn tha sinn a’ toirt luchd-leasachaidh nas fheàrr oir is urrainn dhuinn biastagan a ghlacadh nas fheàrr ann an leasachadh agus còd a thoirt gu buil a tha gu nàdarra nas fhasa a leughadh agus a thuigsinn.

Tha transpiling cuideachd a ’toirt comas dhuinn ar còd a dhì-cheangal le riatanasan PHP sònraichte bhon CMS. Faodaidh sinn sin a dhèanamh a-nis ma tha sinn airson an dreach as ùire de PHP a chleachdadh gus plugan WordPress no modal Drupal a tha ri fhaighinn gu poblach a chruthachadh gun a bhith a ’cuingealachadh gu mòr ris an stòr-cleachdaidh againn.

A bheil ceistean agad air fhàgail mu bhith ag atharrachadh PHP? Leig fios thugainn anns an earrann bheachdan!

artaigealan co-cheangailte

agus tha

이메일 주소는 공개되지 않습니다.

Putan air ais dhan mhullach