ไลบรารีการกำหนดเวอร์ชันความหมายสำหรับ PHP โดยจะใช้ข้อกำหนดคุณสมบัติซีแมนติกเวอร์ชัน 2.0.0 เต็มรูปแบบ และให้ความสามารถใน การแยกวิเคราะห์ เปรียบเทียบ และ เพิ่ม เวอร์ชันซีแมนติกพร้อมกับการตรวจสอบกับ ข้อจำกัด
เวอร์ชัน | เวอร์ชันพีเอชพี |
---|---|
>=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()
ยังสามารถใช้เป็น callback สำหรับ 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-Range : อักขระ 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
Caret Range ( ^
) : อธิบายช่วงโดยคำนึงถึงส่วนที่ไม่เป็นศูนย์ซ้ายสุดของเวอร์ชัน
^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
เมื่อการแยกวิเคราะห์ล้มเหลว