ប្រតិបត្តិករ Walrus នៅក្នុង PHP

នៅក្នុងខែតុលា ឆ្នាំ 2019 Python 3.8 បានណែនាំប្រតិបត្តិករ Walrus (:=) តាមរយៈ PEP 572 - ហើយដោយហេតុនេះ បានបង្កឱ្យមានភាពចម្រូងចម្រាសដ៏ធំបំផុតមួយនៅក្នុងប្រវត្តិសាស្ត្រនៃភាសាសរសេរកម្មវិធី។ ការជជែកវែកញែកគឺជូរចត់ណាស់ដែលអ្នកបង្កើត Python លោក Guido van Rossum នៅខែកក្កដាឆ្នាំ 2018 - សូម្បីតែមុនពេលការចេញផ្សាយ - តំណែងរបស់គាត់ជា BDFL (សប្បុរសជនផ្តាច់ការសម្រាប់ជីវិត) ចាប់តាំងពីដើមឆ្នាំ 2019 មក Python ត្រូវបានគ្រប់គ្រងដោយក្រុមប្រឹក្សាដឹកនាំដែលជាប់ឆ្នោតជំនួសវិញ។


if (n := len(items)) > 10:
    print(f"List is too long ({n} elements)")

ការប្រេះឆាផ្នែកអភិបាលកិច្ចបានកើតឡើងភ្លាមៗបន្ទាប់ពីការពិភាក្សារបស់ Walrus ដែលជាករណីដ៏កម្រដែលលក្ខណៈពិសេសភាសាតែមួយមានផលវិបាកជារចនាសម្ព័ន្ធ។ នៅក្នុងសេចក្តីថ្លែងការណ៍របស់គាត់ លោក van Rossum បានពន្យល់ថា "ចំបើងចុងក្រោយគឺជាសំណើកែលម្អ Python ដ៏ចម្រូងចម្រាសមួយ។ បន្ទាប់ពីខ្ញុំបានទទួលយកវា មនុស្សបានចូលទៅក្នុងប្រព័ន្ធផ្សព្វផ្សាយសង្គមដូចជា Twitter ហើយនិយាយអ្វីដែលធ្វើឱ្យខ្ញុំឈឺចាប់ផ្ទាល់ខ្លួន" ។

គាត់បានបន្តទៀតថា "ឥឡូវនេះ PEP 572 ត្រូវបានបញ្ចប់ ខ្ញុំមិនដែលចង់មានការតស៊ូខ្លាំងសម្រាប់ PEP ម្តងទៀតទេ ហើយឃើញថាមនុស្សជាច្រើនស្អប់ការសម្រេចចិត្តរបស់ខ្ញុំ។ ខ្ញុំចង់ដកខ្លួនចេញពីដំណើរការធ្វើសេចក្តីសម្រេចទាំងស្រុង"។ ការរិះគន់នេះមិនត្រឹមតែមកពីសហគមន៍ទូលំទូលាយប៉ុណ្ណោះទេ ប៉ុន្តែក៏មកពីអ្នកអភិវឌ្ឍន៍ស្នូលផងដែរ។

ពួកគេបានប្រកែកថាប្រតិបត្តិករបានជំទាស់នឹងគោលការណ៍ Python ជាមូលដ្ឋានពី Zen of Python ជាពិសេសចំណង់ចំណូលចិត្តសម្រាប់ភាពសាមញ្ញជាងភាពស្មុគស្មាញ។ បន្ទាប់​ពី​ជិត​បី​ទសវត្សរ៍​ក្នុង​នាម​ជា​អ្នក​រចនា​ភាសា​ដែល​គ្មាន​ជម្លោះ នេះ​ជា​ការ​បញ្ចប់​នៃ​យុគសម័យ​មួយ។ ប៉ុន្តែខណៈពេលដែល Python ត្រូវណែនាំប្រតិបត្តិករ Walrus ថ្មីដោយបែងចែកសហគមន៍របស់ខ្លួននៅក្នុងដំណើរការនោះ សំណួរកើតឡើង: តើភាសាផ្សេងទៀតដោះស្រាយគោលគំនិតស្រដៀងគ្នាដោយរបៀបណា?

ប្រតិបត្តិករ Python := (ឈ្មោះហៅក្រៅ Assignment Expression "Walrus") មិនមាននៅក្នុង PHP ទេ ដោយសារវាមិនត្រូវការ។ នៅក្នុង PHP, assignment operator = ជានិច្ច សេចក្តីថ្លែងការណ៍និងការបញ្ចេញមតិក្នុងពេលតែមួយ: កិច្ចការមួយត្រឡប់តម្លៃដែលបានកំណត់។ នេះពិតជាមូលហេតុដែលលំនាំ idiomatic ដូចជា "assign-and-test" ដំណើរការ if-លក្ខខណ្ឌ​ដោយ​មិន​មាន​លក្ខណៈ​ពិសេស​ភាសា​របស់​ពួក​គេ​។

function get_some_field() {
    return 'foo';
}
if ($a = get_some_field()) {
    echo $a; // foo
}
// Hinweis: $a ist *gesetzt*, selbst wenn die Bedingung falsy wäre.

$a = get_some_field() ចាត់តាំង និងវាយតម្លៃទៅផ្នែកខាងស្តាំ។ ប្រសិនបើនេះជា "ការពិត" អ្នកចូល if- ប្លុក។ ផ្ទៃខាងក្រោយ៖ នៅក្នុង Python, := (PEP 572) ព្រោះកិច្ចការសាមញ្ញមិនមែនជាកន្សោមទេ។ នៅក្នុង PHP នេះតែងតែមានភាពខុសគ្នា ដូច្នេះមិនចាំបាច់មានសមមូលទេ។ រឿងពីរច្រើនតែនាំទៅរកកំហុស។: = (ការចាត់ចែង) មានអាទិភាពទាបជាងប្រតិបត្តិករទំនាក់ទំនងភាគច្រើន; វង់ក្រចកកំណត់ការវាយតម្លៃ។

នៅក្នុងកន្សោមស្មុគស្មាញ អ្នកគួរតែប្រើវង់ក្រចកជានិច្ច ដើម្បីបង្កើនការអាន និងភាពច្បាស់លាស់។ ?? មានអទិភាពទាបផ្ទាល់ខ្លួន។ នេះពន្យល់ពីការភ្ញាក់ផ្អើលនៅក្នុងកន្សោមដូចជា $x ?? null === null. ដោយគ្មានវង់ក្រចក ទីមួយ null === null បានវាយតម្លៃ។ វាជាការល្អប្រសើរជាងមុនដើម្បីតែងតែតង្កៀបយ៉ាងច្បាស់: ($x ?? null) === null. $a ក៏មាននៅខាងក្រៅដែរ។ if- ប្លុក - ប្រហែលជាមានតម្លៃក្លែងក្លាយ។

function get_some_field() {
    return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
    echo $a; // bar
}

ដូច្នេះវាច្បាស់ណាស់។ === 'bar' ត្រូវបានអនុវត្តទៅតម្លៃដែលបានកំណត់។ តង្កៀបមានសារៈសំខាន់នៅទីនេះសម្រាប់លទ្ធភាពអាន និងអាទិភាព។ នៅក្នុងការអនុវត្ត គំរូនេះជៀសវាងការហៅស្ទួនដែលមិនចាំបាច់ (ឧ. នៃកម្មវិធីបង្កើតសំណួរ) ដោយរក្សាទុកលទ្ធផលសំណួរហើយបន្ទាប់មកពិនិត្យមើលវា។ នៅក្នុងកម្មវិធីដែលមានផលិតភាព ដូចជាគម្រោងដែលមានមូលដ្ឋានលើ Laravel គំរូខាងក្រោមអាចត្រូវបានគេសង្កេតឃើញញឹកញាប់ជាងមុន។:

if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
    dd($foo->get());
}

&& គឺ short-circuiting: ផ្នែកខាងស្តាំត្រូវបានវាយតម្លៃតែប៉ុណ្ណោះប្រសិនបើផ្នែកខាងឆ្វេងគឺជាការពិត។ តាមរយៈការចាត់តាំងសេចក្តីថ្លែងការណ៍ខាងលើ អ្នកជៀសវាងការផ្តល់សេចក្តីថ្លែងការណ៍នៅខាងក្រៅ if statement។ ថាតើនេះជាការអនុវត្តល្អឬអត់ អាស្រ័យលើកូដ និងឧបករណ៍វិភាគរបស់ក្រុមអ្នក តាមន័យត្រង់ វាត្រឹមត្រូវ។ យ៉ាងហោចណាស់ អ្នកគួរតែដឹងពីអ្វីដែលកូដធ្វើ ប្រសិនបើអ្នកជួបប្រទះវានៅក្នុងព្រៃ។

PHP មិនត្រូវការ "Walrus operator" ទេ ពីព្រោះ assignments គឺជា expressions រួចហើយ។ នេះធ្វើឱ្យលំនាំ idiomatic ដូចជា "assign-and-test" អាចធ្វើទៅបាន - អនុវត្ត និងសង្ខេប។ ក្នុងពេលជាមួយគ្នានេះ ការទាមទារលើការបង្កើនវិន័យ៖ វង់ក្រចក ការប្រៀបធៀបដ៏តឹងរឹង ការយល់ដឹងអំពីការពិត/មិនពិត និងអនុសញ្ញាក្រុមច្បាស់លាស់គឺជាកាតព្វកិច្ច។ អ្នកដែលធ្វើតាមការណែនាំទាំងនេះ ទទួលបានអត្ថប្រយោជន៍នៃគំនិត Walrus ដោយមិនចាំបាច់មានលក្ខណៈពិសេសភាសាបន្ថែម។

ថយក្រោយ