NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #800 most downloaded on Packagist
The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects
Last release 3 months ago
07 Jul 2026
Release timing varies
gaps range from 3 weeks to 10 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
99 releases · first in 2012
This major release v5 declares function parameter and return types across the codebase. Users will need to be careful to call functions/methods with t
This major release v5 declares function parameter and return types across the
codebase. Users will need to be careful to call functions/methods with the
correct types.
Support for PHP below 8.2 has been dropped.
This release supports PHP 8.2 and up.
4.6.1 (2026-07-07) #776 fix: preserve UTC 'Z' indicator in Period JSON serialization ( @bastien-roucaries @guimard @phil-davis )
One column per quarter.
Various deprecated time zones are updated to their new/current values by #756 FindFromTimezoneMap::find no longer throws an (undocumented) exception w…
A new getByTypes method has been added for Vcards. This allows the caller to get a specific property that has the specified list of types. See issue #717 for more details.
Various deprecated time zones are updated to their new/current values by #756
FindFromTimezoneMap::find no longer throws an (undocumented) exception when a timezone is not found. It will now return null, which was already a documented possible return in the return type definition. The method now conforms to its documented behaviour. But callers may have been expecting to catch an “unexpected” exception, so this change may require changes for callers that need to handle occurences of invalid time zones.
4.5.9 (2026-05-31) #759 fix(itip): handle null old calendar/event ( @ChristophWurst )
4.5.8 (2026-01-12) #721 : Fix variable scope ( @KristofferFM ) #723 : Broker shouldn't add EXDATE property with floating timezone ( @KristofferFM ) #7
4.5.7 (2025-04-17) #618 : Add new exchangetimezone 'Amsterdam, Berlin, Bern, Rom, Stockholm, Wien' ( @chr-is ) #674 : Allow unknown value data types f
4.5.6 (2024-10-14) #662 : add PHP 8.4 to CI ( @phil-davis ) #669 : fix: check if event status was changed to cancelled and generate appropriate messag
Provides support for PHP 8.4
Full Changelog: 4.5.5...4.5.6
4.5.5 (2024-07-02) #632 : Add PHP 8.3 to CI ( @phil-davis ) #649 : add lineIndex and lineString properties to a Property Node ( @JohnRDOrazio ) #652 :
4.5.4 (2023-11-09) #619 : fixed issue: Undefined index: plusminus ( @sash04ek ) #622 : Create Issue467Test.php for 619 ( @sash04ek ) #623 : docs: fix
Release 4.5.2 was accidentally done from master branch, which had other changes that have various backward-compatibility issues and may not work with
Release 4.5.2 was accidentally done from master branch, which had other changes that have various backward-compatibility issues and may not work with older PHP before 7.4.
This release 4.5.3 is from the 4.5 branch. It includes the dependency change from PR #603 to allow using sabre/xml v3 or v4 as well as v2.
To do that, a couple of return types had to be declared - xmlSerialize returns void and xmlDeserialize returns array. Those declarations are supported from PHP 7.1 onward, so that is fine for the 4.5 release series.
If you start using sabre/xml major version 3 or 4 and are redeclaring/inheriting these in your code, then you may also need to make the matching return-type declarations. But this small thing is a lot better than the large amount of code changes that were accidentally released as 4.5.2.
* #603: Support sabre/xml v4 (@gharlan)
* #597: Remove utf8_encode to easily support PHP 8.2 (@phil-davis)
* #579: Update .gitattributes (@cedric-anne) * #561: PHP 8.1 deprecated support for null values in its APIs (@mstilkerich) * #571: Fully ignore invali
* #577: Ignore multiple same parameter-values (@heiglandreas)
* #565: lowercase mailto:-addresses in getNormalizedValue() (@pk1234) * #568: Add NICKNAME fallback for VCards without FNs (@Evengard) * #573: Compone
#557: Fix Iterator method signatures and avoid passing null as separator for implode (PHP 8.1 support) (@come-nc)
#557: Fix Iterator method signatures and avoid passing null as separator for implode (PHP 8.1 support) (@come-nc)
#548: Allow easier extension of the timezone guessing (@heiglandreas)
#548: Allow easier extension of the timezone guessing (@heiglandreas)
* #538: fix EventIterator returns wrong end endTime (@floerke) * #541: Reordering of the attendees is not a significant change (@floerke) * #543: Reor
* #551: version bump that was missed in 4.3.6 (@phil-davis)
* #544: Fix deprecated usages and return types on PHP 8.1 (@cedric-anne)
* #523: Fix setting properties with group assignment (@mstilkerich) * #532: Make use of until parameter in nextMonthly function (@jaircuevajunior)
* #529: Reassign modified date in yearly rrule (@laoneo) * #525: Add .gitattributes to reduce package size (@fezfez)
* #519: Remove US/Pacific-New obsolete timezone (@phil-davis)
* #513: Added Support for PHP 8.0 (@phil-davis)
* #510: Fix an incomplete phpdoc type annotation (@mstilkerich) * #505: Refactor unit test code for phpunit9 (@phil-davis) * #500: Standardize CI (@ph
Added support for PHP 7.4, dropped support for PHP 7.0 (@phil-davis)
* #465: Add TZ in iTip REPLY iTip messages * #486: Add PHONE-NUMBER value type (used for TEL in vCard 3.0)
* #469, #451: fix compat with php 7.4 * #443: prevent running in indefinite loop * #449: Preventing creating a component for a root document * #450: F
* #432: DTSTAMP must be specified in UTC * #435: ORGANIZER e-mail address are case-insensitive * #441: Repairing BASE64 encoded vCard version 3
* #412: Broker: add timezone to CANCEL messages * #424: Support php7.3
* #406, #407, #408, #409: Another round of performance improvements in serialization of properties (@gharlan, @staabm) * #410: Fixes in iTip for handl
BYDAY=SA,SO (@gharlan)SCHEDULE-FORCE-SEND (@alecpl)* #404: Serialization: Performance boost for long properties (@gharlan)
* #383: Fix possible infinite loop in RRuleIterator, when the RRule FREQ is YEARLY and it uses BYYEARDAY only (@mvdnes). * #392: Improved significant
Canada/East-Saskatchewan timezone, as it got removed
from PHP as well. (@remicollet).* #363: Repair script and de-duplicate properties that are only allowed once, but appear more than once. (@ddolcimascolo). * #377: Added Pacific Time
FNUpdated to the latest windows timezone data mappings.
BYYEARDAY recurrence when FREQ=YEARLY. (@PHPGangsta)BYWEEKNO recurrence when FREQ=YEARLY. (@PHPGangsta)FreeBusyGenerator can now accept streams.DateTimeInterface in more places where only DateTime was
supported. (@gharlan).isInTimeRange and
fastForward with all-day events. (@strokyl, thanks you are brilliant).* #327: Throwing InvalidDataException in more cases where invalid iCalendar dates and times were provided. (@rsto) * #331: Fix dealing with multiple o
InvalidDataException in more cases where invalid iCalendar
dates and times were provided. (@rsto)BYMONTH values in recurrence.
(@PHPGangsta)validate() results when repair is off. (@PHPGangsta)BYMONTH= rules during validate() (@PHPGangsta)BYSECOND= validation. (@PHPGangsta)Slightly better error message during validation of N and ADR properties.
RECURRENCE-ID property.N and ADR properties.VALUE parameter.* #300: Added VCard::getByType() to quickly get a property with a specific TYPE parameter. (@kbond) * #302: UNTIL was not encoded correctly when conve
VCard::getByType() to quickly get a property with a specific
TYPE parameter. (@kbond)UNTIL was not encoded correctly when converting to jCal.
(@GrahamLinagora)COUNT is now encoded as an int in jCal instead of a string. (@strokyl)RRULE now has more validation and repair rules.* #288: Only decode CHARSET if we're reading vCard 2.1. If it appears in any other document, we must ignore it.
CHARSET if we're reading vCard 2.1. If it appears
in any other document, we must ignore it.* #284: When generating CANCEL iTip messages, we now include DTEND. (@kewisch)
CANCEL iTip messages, we now include DTEND.
(@kewisch)ParseException now extends \Exception.
VEVENT, VTODO and VCARD now automatically get a UID and
DTSTAMP property if this was not already specified.ParseException now extends \Exception.Sabre\VObject\Reader::read now has a $charset argument.Sabre\VObject\Recur\EventIterator::$maxInstances is now
Sabre\VObject\Settings::$maxRecurrences and is also honored by the
FreeBusyGenerator.expand() did not work correctly on events with sub-components.It's now possible to override which class is used instead of Component\VCalendar or Component\VCard during parsing.
RDATE. (@jabdoa2)RDATE. (@jabdoa2)Component\VCalendar::expand() now returns a new expanded VCalendar
object, instead of editing the existing VCalendar in-place. This is a BC
break.InvalidDataException in place of
InvalidArgumentException and LogicException in all places where we fail
because there was something wrong with input data.VALUE=URI to PHOTO properties.VALUE=URI to URL properties.Component\VCalendar or Component\VCard during parsing.ENCODING parameter from vCard 2.1.
Both ISO-8859-1 and Windows-1252 are currently supported.TIME values in jCal/jCard.Updated windows timezone file to support new mexican timezone.
BirthdayCalendarGenerator. (@DominikTo)isInTimeRange() now considers the timezone for floating dates and
times. (@armin-hackmann)isInTimeRange() now correctly handles events that throw the
NoInstancesException exception. (@migrax, @DominikTo)E_NOTICE for certain invalid objects. It now
correctly throws a ParseException.sabre/vobject now requires PHP 5.5.
DateTimeInterface wherever it accepted DateTime
before in arguments. This means that either DateTime or
DateTimeImmutable may be used everywhere.VAVAILABILITY component, and calculating
VFREEBUSY based on VAVAILABILITY data.UTC-OFFSET properties when going back and
forward between jCal and iCalendar.JsonSerializable
interface.DateTimeImmutable from any method. This could
potentially have big implications if you manipulate Date objects anywhere.ElementList by extending ArrayIterator.RecurrenceIterator (use Recur\EventIterator instead).+00:00 timezone is now recognized as UTC. (@c960657)destroy() method to all documents. This method breaks any
circular references, allowing PHP to free up memory.$children property on components has been changed from public
to protected. Use the children() method instead to get a flat list of
objects.Float and Integer classes have been renamed to FloatValue
and IntegerValue to allow PHP 7 compatibility.* #331: Fix dealing with multiple overridden instances falling on the same date/time (@afedyk-sugarcrm).
* #312: Backported a fix related to iTip processing of events with timezones, without a master event.
* #309: When expanding recurring events, the first event should also have a RECURRENCE-ID property. * #306: iTip REPLYs to the first instance of a rec
RECURRENCE-ID property.This release supports PHP 7, contrary to 3.4.x versions.
Sabre\VObject\Property\Float has been renamed to
Sabre\VObject\Property\FloatValue.Sabre\VObject\Property\Integer has been renamed to
Sabre\VObject\Property\IntegerValue.This package now specifies in composer.json that it does not support PHP 7. For PHP 7, use version 3.5.x or 4.x.
* #284: When generating CANCEL iTip messages, we now include DTEND. (@kewisch).
CANCEL iTip messages, we now include DTEND.
(@kewisch).* #253: Handle isInTimeRange for recurring events that have 0 valid instances. (@DominikTo, @migrax).
isInTimeRange for recurring events that have 0 valid
instances. (@DominikTo, @migrax).* #250: Recurring all-day events are incorrectly included in time range requests when not using UTC in the time range. (@armin-hackmann)
* #229: Converting vcards from 3.0 to 4.0 that contained a LANG property would throw an error.
LANG property
would throw an error.* #228: Fixed a 'party crasher' bug in the iTip broker. This would break scheduling in some cases.
* #219: Corrected validation of EXDATE properties with more than one value. * #212: BYSETPOS with values below -1 was broken and could cause infinite
EXDATE properties with more than one value.BYSETPOS with values below -1 was broken and could cause infinite
loops.BYDAY=-5TH in recurrence iterator. (@lindquist)ENCODING parameter is now validated for all document types.DATE objects with a PHP DateTime object will now
work correctly. (@thomascube)* #210: iTip: Replying to an event without a master event was broken.
A minor change to ensure that unittests work correctly in the sabre/dav test-suite.
Updated windows timezone mappings to latest unicode version.
VAVAILABILITY components. (@Hywan)EXDATE when processing iTip changes.
(@armin-hackmann)LAST-MODIFIED properties.Recur\EventIterator.* #168: Expanding calendars now removes objects with recurrence rules that don't have a valid recurrence instance. * #177: SCHEDULE-STATUS should not
isFloating to DATE-TIME properties.DATE-TIME properties.X-ABDATE properties that had no
X-ABLABEL.PROFILE_CALDAV and PROFILE_CARDDAV to enable validation rules
specific for CalDAV/CardDAV servers.UID is no longer an error, but a warning for the vCard
validator, unless PROFILE_CARDDAV is specified.* #154: Converting ANNIVERSARY to X-ANNIVERSARY and X-ABDATE and vice-versa when converting to/from vCard 4. * #154: It's now possible to easily selec
ANNIVERSARY to X-ANNIVERSARY and X-ABDATE and
vice-versa when converting to/from vCard 4.$vcard->{'ITEM1.'} syntax. (@armin-hackmann)RECURRENCE-ID when expanding.RECURRENCE-ID for all-day events will now be correct when expanding.getTimeZone() method to VTIMEZONE components.Your coding agent can read these notes before it upgrades. Set up the MCP server →