مكتبة الإصدارات الدلالية لـ PHP. وهو ينفذ مواصفات الإصدار الدلالي الكامل 2.0.0 ويوفر القدرة على تحليل ومقارنة وزيادة الإصدارات الدلالية جنبا إلى جنب مع التحقق من صحة القيود .
إصدار | نسخة PHP |
---|---|
>=1.0, <1.2 | >=5.5 |
>=1.2, <3.0 | >=7.1 |
>=3.0 | >=8.1 |
composer require z4kn4fein/php-semver
يتم دعم الخيارات التالية لإنشاء Version
:
البناء جزءًا تلو الآخر باستخدام Version::create()
.
Version:: create ( 3 , 5 , 2 , " alpha " , " build " );
التحليل من سلسلة باستخدام Version::parse()
أو Version::parseOrNull()
.
Version:: parse ( " 3.5.2-alpha+build " );
يمكن الوصول إلى المعلومات التالية على كائن Version
الذي تم إنشاؤه:
<?php
use z4kn4fein SemVer Version ;
$ version = Version:: parse ( " 2.5.6-alpha.12+build.34 " );
echo $ version -> getMajor (); // 2
echo $ version -> getMinor (); // 5
echo $ version -> getPatch (); // 6
echo $ version -> getPreRelease (); // alpha.12
echo $ version -> getBuildMeta (); // build.34
echo $ version -> isPreRelease (); // true
echo $ version -> isStable (); // false
echo $ version -> withoutSuffixes (); // 2.5.6
echo $ version ; // 2.5.6-alpha.12+build.34
افتراضيًا، يعتبر محلل الإصدار الإصدارات الجزئية مثل 1.0
والإصدارات التي تبدأ بالبادئة v
غير صالحة. يمكن إيقاف هذا السلوك عن طريق تعيين المعلمة strict
على false
.
echo Version:: parse ( " v2.3-alpha " ); // exception
echo Version:: parse ( " 2.1 " ); // exception
echo Version:: parse ( " v3 " ); // exception
echo Version:: parse ( " v2.3-alpha " , false ); // 2.3.0-alpha
echo Version:: parse ( " 2.1 " , false ); // 2.1.0
echo Version:: parse ( " v3 " , false ); // 3.0.0
من الممكن مقارنة كائنين Version
بطرق المقارنة التالية.
<?php
use z4kn4fein SemVer Version ;
// with static methods
echo Version:: lessThan ( " 2.3.4 " , " 2.4.1 " ); // true
echo Version:: lessThanOrEqual ( " 2.4.1 " , " 2.4.1 " ); // true
echo Version:: greaterThan ( " 2.3.1-alpha.5 " , " 2.3.1-alpha.3 " ); // true
echo Version:: greaterThanOrEqual ( " 3.2.3 " , " 3.2.2 " ); // true
echo Version:: equal ( " 3.2.3 " , " 3.2.3+build.3 " ); // true
echo Version:: notEqual ( " 3.2.3 " , " 2.2.4 " ); // true
// compare() or compareString()
echo Version:: compare (Version:: parse ( " 2.3.4 " ), Version:: parse ( " 2.4.1 " )); // -1
echo Version:: compare (Version:: parse ( " 2.3.4 " ), Version:: parse ( " 2.3.4 " )); // 0
echo Version:: compare (Version:: parse ( " 2.3.4 " ), Version:: parse ( " 2.2.0 " )); // 1
echo Version:: compareString ( " 2.3.4 " , " 2.4.1 " ); // -1
echo Version:: compareString ( " 2.3.4 " , " 2.3.4 " ); // 0
echo Version:: compareString ( " 2.3.4 " , " 2.2.0 " ); // 1
// with instance methods
$ version = Version:: parse ( " 2.5.6-alpha.12+build.34 " );
echo $ version -> isLessThan (Version:: parse ( " 2.3.1 " )); // false
echo $ version -> isLessThanOrEqual (Version:: parse ( " 2.5.6-alpha.15 " )); // true
echo $ version -> isGreaterThan (Version:: parse ( " 2.5.6 " )); // false
echo $ version -> isLessThanOrEqual (Version:: parse ( " 2.5.6-alpha.12 " )); // true
echo $ version -> isEqual (Version:: parse ( " 2.5.6-alpha.12+build.56 " )); // true
echo $ version -> isNotEqual (Version:: parse ( " 2.2.4 " )); // true
Version::sort()
و Version::sortString()
متاحان لفرز مجموعة من الإصدارات.
<?php
use z4kn4fein SemVer Version ;
$ versions = array_map ( function ( string $ version ) {
return Version:: parse ( $ version );
}, [
" 1.0.1 " ,
" 1.0.1-alpha " ,
" 1.0.1-alpha.beta " ,
" 1.0.1-alpha.3 " ,
" 1.0.1-alpha.2 " ,
" 1.1.0 " ,
" 1.1.0+build " ,
]);
$ sorted = Version:: sort ( $ versions );
// The result:
// "1.0.1-alpha"
// "1.0.1-alpha.2"
// "1.0.1-alpha.3"
// "1.0.1-alpha.beta"
// "1.0.1"
// "1.1.0"
// "1.1.0+build"
قد ترغب في الفرز بترتيب عكسي، ثم يمكنك استخدام Version::rsort()
أو Version::rsortString()
.
<?php
use z4kn4fein SemVer Version ;
$ versions = array_map ( function ( string $ version ) {
return Version:: parse ( $ version );
}, [
" 1.0.1 " ,
" 1.0.1-alpha " ,
" 1.0.1-alpha.beta " ,
" 1.0.1-alpha.3 " ,
" 1.0.1-alpha.2 " ,
" 1.1.0 " ,
" 1.1.0+build " ,
]);
$ sorted = Version:: rsort ( $ versions );
// The result:
// "1.1.0"
// "1.1.0+build"
// "1.0.1"
// "1.0.1-alpha.beta"
// "1.0.1-alpha.3"
// "1.0.1-alpha.2"
// "1.0.1-alpha"
يمكن أيضًا استخدام أساليب Version::compare()
و Version::compareString()
كرد اتصال لـ usort()
لفرز مجموعة من الإصدارات.
<?php
use z4kn4fein SemVer Version ;
$ versions = array_map ( function ( string $ version ) {
return Version:: parse ( $ version );
}, [
" 1.0.1 " ,
" 1.0.1-alpha " ,
" 1.0.1-alpha.beta " ,
" 1.0.1-alpha.3 " ,
" 1.0.1-alpha.2 " ,
" 1.1.0 " ,
" 1.1.0+build " ,
]);
usort ( $ versions , [ " z4kn4feinSemVerVersion " , " compare " ]);
// The result:
// "1.0.1-alpha"
// "1.0.1-alpha.2"
// "1.0.1-alpha.3"
// "1.0.1-alpha.beta"
// "1.0.1"
// "1.1.0"
// "1.1.0+build"
مع القيود، من الممكن التحقق من صحة ما إذا كان الإصدار يلبي مجموعة من القواعد أم لا. يمكن وصف القيد بأنه شرط واحد أو أكثر مدمج مع عوامل التشغيل المنطقية OR
و AND
.
تتكون الشروط عادةً من عامل مقارنة وإصدار مثل >=1.2.0
. سيتم استيفاء الشرط >=1.2.0
بواسطة أي إصدار أكبر من أو يساوي 1.2.0
.
عوامل المقارنة المدعومة:
=
يساوي (أي ما يعادل عدم وجود عامل: 1.2.0
يعني =1.2.0
)!=
لا يساوي<
أقل من<=
أقل من أو يساوي>
أعظم من>=
أكبر من أو يساوي يمكن ضم الشروط مع مسافة بيضاء، مما يمثل العامل المنطقي AND
بينهما. يمكن التعبير عن عامل التشغيل OR
بـ ||
أو |
بين مجموعات الشروط
على سبيل المثال، القيد >=1.2.0 <3.0.0 || >4.0.0
يترجم إلى: يُسمح فقط بالإصدارات التي تكون أكبر من أو تساوي 1.2.0
{ AND } أقل من 3.0.0
{ OR } أكبر من 4.0.0
.
يمكننا أن نلاحظ أن الجزء الأول من القيد السابق ( >=1.2.0 <3.0.0
) هو نطاق إصدار دلالي بسيط. هناك المزيد من الطرق للتعبير عن نطاقات الإصدارات؛ سيتناول القسم التالي جميع الخيارات المتاحة.
هناك مؤشرات نطاق محددة وهي سكريات للتعبيرات ذات النطاق الأوسع.
النطاق X : يمكن استخدام الأحرف x
و X
و *
كحرف بدل للأجزاء الرقمية من الإصدار.
1.2.x
يُترجم إلى >=1.2.0 <1.3.0-0
1.x
يُترجم إلى >=1.0.0 <2.0.0-0
*
يترجم إلى >=0.0.0
في تعبيرات الإصدار الجزئي، يتم التعامل مع الأرقام المفقودة كأحرف بدل.
1.2
يعني 1.2.x
والذي يُترجم أخيرًا إلى >=1.2.0 <1.3.0-0
1
يعني 1.x
أو 1.xx
والذي يترجم أخيرًا إلى >=1.0.0 <2.0.0-0
نطاق الواصلة : يصف نطاق الإصدار الشامل. يتم تقييم أحرف البدل وأخذها في الاعتبار في النطاق النهائي.
1.0.0 - 1.2.0
يُترجم إلى >=1.0.0 <=1.2.0
1.1 - 1.4.0
يعني >=(>=1.1.0 <1.2.0-0) <=1.4.0
والذي يُترجم أخيرًا إلى >=1.1.0 <=1.4.0
1.1.0 - 2
تعني >=1.1.0 <=(>=2.0.0 <3.0.0-0)
والذي يُترجم أخيرًا إلى >=1.1.0 <3.0.0-0
نطاق التلدة ( ~
) : يصف نطاق مستوى التصحيح عندما يتم تحديد الإصدار الثانوي أو نطاق المستوى الثانوي عندما لا يكون كذلك.
~1.0.1
إلى >=1.0.1 <1.1.0-0
~1.0
إلى >=1.0.0 <1.1.0-0
~1
يُترجم إلى >=1.0.0 <2.0.0-0
~1.0.0-alpha.1
إلى >=1.0.1-alpha.1 <1.1.0-0
نطاق علامة الإقحام ( ^
) : يصف النطاق فيما يتعلق بالجزء الأيسر غير الصفري من الإصدار.
^1.1.2
يُترجم إلى >=1.1.2 <2.0.0-0
^0.1.2
يُترجم إلى >=0.1.2 <0.2.0-0
^0.0.2
يُترجم إلى >=0.0.2 <0.0.3-0
^1.2
يُترجم إلى >=1.2.0 <2.0.0-0
^1
يُترجم إلى >=1.0.0 <2.0.0-0
^0.1.2-alpha.1
يُترجم إلى >=0.1.2-alpha.1 <0.2.0-0
دعونا نرى كيف يمكننا تحديد ما إذا كان الإصدار يلبي أحد القيود أم لا.
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Constraints Constraint ;
$ constraint = Constraint:: parse ( " >=1.2.0 " );
$ version = Version:: parse ( " 1.2.1 " );
echo $ version -> isSatisfying ( $ constraint ); // true
echo $ constraint -> isSatisfiedBy ( $ version ); // true
// Or using the static satisfies() method with strings:
echo Version:: satisfies ( " 1.2.1 " , " >=1.2.0 " ); // true
يمكن لكائنات Version
إنتاج إصدارات متزايدة من نفسها باستخدام أساليب getNext{Major|Minor|Patch|PreRelease}Version
. يمكن استخدام هذه الطرق لتحديد الإصدار التالي بالترتيب المتزايد حسب الجزء المناسب. كائنات Version
غير قابلة للتغيير ، لذا فإن كل دالة متزايدة تنشئ Version
جديدًا.
يوضح هذا المثال كيفية عمل الزيادة على إصدار مستقر:
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Inc ;
$ stableVersion = Version:: create ( 1 , 0 , 0 );
echo $ stableVersion -> getNextMajorVersion (); // 2.0.0
echo $ stableVersion -> getNextMinorVersion (); // 1.1.0
echo $ stableVersion -> getNextPatchVersion (); // 1.0.1
echo $ stableVersion -> getNextPreReleaseVersion (); // 1.0.1-0
// or with the inc() method:
echo $ stableVersion -> inc (Inc:: MAJOR ); // 2.0.0
echo $ stableVersion -> inc (Inc:: MINOR ); // 1.1.0
echo $ stableVersion -> inc (Inc:: PATCH ); // 1.0.1
echo $ stableVersion -> inc (Inc:: PRE_RELEASE ); // 1.0.1-0
في حالة وجود نسخة غير مستقرة:
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Inc ;
$ unstableVersion = Version:: parce ( " 1.0.0-alpha.2+build.1 " );
echo $ unstableVersion -> getNextMajorVersion (); // 2.0.0
echo $ unstableVersion -> getNextMinorVersion (); // 1.1.0
echo $ unstableVersion -> getNextPatchVersion (); // 1.0.0
echo $ unstableVersion -> getNextPreReleaseVersion (); // 1.0.0-alpha.3
// or with the inc() method:
echo $ unstableVersion -> inc (Inc:: MAJOR ); // 2.0.0
echo $ unstableVersion -> inc (Inc:: MINOR ); // 1.1.0
echo $ unstableVersion -> inc (Inc:: PATCH ); // 1.0.0
echo $ unstableVersion -> inc (Inc:: PRE_RELEASE ); // 1.0.0-alpha.3
توفر كل وظيفة متزايدة خيار تعيين هوية ما قبل النشر على الإصدار المتزايد.
<?php
use z4kn4fein SemVer Version ;
use z4kn4fein SemVer Inc ;
$ version = Version:: parce ( " 1.0.0-alpha.1 " );
echo $ version -> getNextMajorVersion ( " beta " ); // 2.0.0-beta
echo $ version -> getNextMinorVersion ( "" ); // 1.1.0-0
echo $ version -> getNextPatchVersion ( " alpha " ); // 1.0.1-alpha
echo $ version -> getNextPreReleaseVersion ( " alpha " ); // 1.0.0-alpha.2
// or with the inc() method:
echo $ version -> inc (Inc:: MAJOR , " beta " ); // 2.0.0-beta
echo $ version -> inc (Inc:: MINOR , "" ); // 1.1.0-0
echo $ version -> inc (Inc:: PATCH , " alpha " ); // 1.0.1-alpha
echo $ version -> inc (Inc:: PRE_RELEASE , " alpha " ); // 1.0.0-alpha.2
من الممكن عمل نسخة من إصدار معين باستخدام طريقة copy()
. يسمح بتعديل خصائص النسخة المنسوخة باستخدام معلمات اختيارية.
$ version = Version:: parse ( " 1.0.0-alpha.2+build.1 " );
echo $ version -> copy (); // 1.0.0-alpha.2+build.1
echo $ version -> copy ( 3 ); // 3.0.0-alpha.2+build.1
echo $ version -> copy ( null , 4 ); // 1.4.0-alpha.2+build.1
echo $ version -> copy ( null , null , 5 ); // 1.0.5-alpha.2+build.1
echo $ version -> copy ( null , null , null , " alpha.4 " ); // 1.0.0-alpha.4+build.1
echo $ version -> copy ( null , null , null , null , " build.3 " ); // 1.0.0-alpha.2+build.3
echo $ version -> copy ( 3 , 4 , 5 ); // 3.4.5-alpha.2+build.1
ملحوظة
بدون تعيين أي معلمة اختيارية، ستنتج طريقة copy()
نسخة طبق الأصل من الإصدار الأصلي.
عندما يفشل تحليل الإصدار أو القيد بسبب تنسيق غير صالح، تقوم المكتبة بطرح SemverException
محدد.
ملحوظة
يمكن استخدام أساليب Version::parseOrNull()
و Constraint::parseOrNull()
للتحويلات الأقل استثناءً لأنها تُرجع null
عند فشل التحليل.