You really don't need to directly to packets to change a sign'd text. You can use Level::getTile(Vector3) and check if it's an instanceof Sign tile, then Tile::setText(string 1, string 2, string 3, string 4)
I guess his need is to change text only for a particular player. Blame PM's poor API. Also, I think an assertion for `instanceof Sign` instead of an if is more appropriate.
PHP: $pk = new \pocketmine\network\protocol\BlockEntityDataPacket();$data = $tile->getSpawnCompound();$data->Text1->setValue("Text1","Line1");$data->Text2->setValue("Text2","Line2");$data->Text3->setValue("Text3","Line3");$data->Text4->setValue("Text4","Line4");$nbt = new \pocketmine\nbt\NBT(NBT::LITTLE_ENDIAN);$nbt->setData($data);$pk->x = $tile->getX();$pk->y = $tile->getY();$pk->z = $tile->getZ();$pk->namedtag = $nbt->write(true);$p->dataPacket($pk);#$p is Player