Actually, there is a specific set of features that guarantees planned obsolescence:
* Irreplaceable battery (or one that is difficult to remove by the user).
* on the iPhone, the Lightning socket and the Home button. The former starts to wear out after ca. 5 years; the Home button lasts a bit longer. Apple will repair both these for you but at this point you will be tempted to buy a new device instead because of the costs involved.
* the support for older devices is being dropped from SDKs. With time, it becomes more and more difficult to develop apps for your device. For many developers this is something completely natural and reasonable. For me it's not. I'm not asking Apple to support iPhone 4s (would be nice, but it's unrealistic), but just to let me still run and provision apps on my old MacBook with a previous version of Xcode. It used to work well in 2012, why can't I do it now? Upgrade, upgrade, upgrade, produce tons of electric waste, buy more, buy more. OK, I am buying new devices, but I care about the old ones. I won't throw away a perfectly working phone that will serve me another 10 years just because it is not considered modern enough.
EOL-ed smartphones are powerful computers, they have tons of different uses, I wish manufacturers recognized it and collaborate with their customers to reduce the amount of electrowaste.
Software restrictions are one way to ensure planned obsolescence.